[bzoj2820]YY的GCD
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10000001 4 int t,n,m,k,mu[N],vis[N],p[N]; 5 long long ans,f[N]; 6 void linear(){ 7 mu[1]=1; 8 for(int i=2;i<N;i++){ 9 if (!vis[i]){ 10 p[++p[0]]=i; 11 mu[i]=-1; 12 f[i]=1; 13 } 14 for(int j=1;i*p[j]<N;j++){ 15 vis[i*p[j]]=1; 16 if (i%p[j]){ 17 mu[i*p[j]]=-mu[i]; 18 f[i*p[j]]=mu[i]-f[i]; 19 } 20 else{ 21 mu[i*p[j]]=0; 22 f[i*p[j]]=mu[i]; 23 break; 24 } 25 } 26 } 27 for(int i=1;i<N;i++)f[i]+=f[i-1]; 28 } 29 int main(){ 30 scanf("%d",&t); 31 linear(); 32 while (t--){ 33 scanf("%d%d",&n,&m); 34 if (n>m)swap(n,m); 35 ans=0; 36 for(int i=1,j;i<=n;i=j+1){ 37 j=min(n/(n/i),m/(m/i)); 38 ans+=(f[j]-f[i-1])*(n/i)*(m/i); 39 } 40 printf("%lld\n",ans); 41 } 42 }