[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 }
View Code

 

posted @ 2019-07-28 10:38  PYWBKTDA  阅读(69)  评论(0编辑  收藏  举报