记录编号 143923 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] Crash的数字表格 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 6.250 s
提交时间 2014-12-18 19:50:40 内存使用 118.08 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const LL MOD=20101009;
const int SIZE=10000010;
LL miu[SIZE];
LL Section_Endpoint(LL n,LL m,LL i){//n/j!=n/i或m/j!=m/i的第一个j,除法是int意义
	return min(n/(n/i),m/(m/i));
}
LL Sigma_NNS(LL m,LL n){//1~n求和
	return ((m+n)*(n-m+1)/2)%MOD;
}
LL Sigma_RP_Mul(LL a,LL b){//1<=x<=a,1<=y<=b,gcd(x,y)=1的xy求和
	LL ans=0,i=1,j;
	while(i<=a&&i<=b){
		j=Section_Endpoint(a,b,i);
		LL now=(Sigma_NNS(1,a/i)*Sigma_NNS(1,b/i))%MOD;
		now=(now*(miu[j]-miu[i-1]+MOD))%MOD;
		ans=(ans+now)%MOD;
		i=j+1;
	}
	return ans;
}
LL Calc(LL n,LL m){//就是题目让求的那个东西
	LL ans=0,i=1,j;
	while(i<=n&&i<=m){
		j=Section_Endpoint(n,m,i);
		//求解i<=gcd(x,y)<=j的lcm(x,y)之和
		LL now=(Sigma_NNS(i,j)*Sigma_RP_Mul(n/i,m/i))%MOD;
		ans=(ans+now)%MOD;
		i=j+1;
	}
	return ans;
}
void Linear_Sieve_Method(int n){//线性筛!
	static bool flag[SIZE]={0};
	static int ptot=0,p[SIZE];
	for(int i=1;i<=n;i++) miu[i]=1;
	for(int i=2;i<=n;i++){
		if(!flag[i]) p[++ptot]=i,miu[i]=-1;
		for(int j=1;j<=ptot;j++){
			if((LL)i*p[j]>n) break;
			flag[i*p[j]]=true,miu[i*p[j]]=-miu[i];
			if(i%p[j]==0){
				miu[i*p[j]]=0;
				break;
			}
		}
	}
	for(int i=1;i<=n;i++) miu[i]=(miu[i-1]+(LL)i*i*miu[i])%MOD;
}
int main(){
	freopen("nt2011_table.in","r",stdin);
	freopen("nt2011_table.out","w",stdout);
	LL n,m;
	scanf("%lld%lld",&n,&m);
	Linear_Sieve_Method(n);
	printf("%lld\n",Calc(n,m));
	return 0;
}