记录编号 |
143923 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队 2011] Crash的数字表格 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}