hdu2841(2009多校第三场) gcd(x,y)==1对数
关键是要能看出来是gcd==1个数===
然后就是素数分解容斥定理了。。
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 int k,n,num; 5 int vis[100005],prime[100005],a[10]; 6 void dfs(int now,int flag,int bei) 7 { 8 int i; 9 if (flag) k+=n/bei; 10 else k-=n/bei; 11 for (i=now+1;i<=num;i++) 12 dfs(i,1-flag,bei*a[i]); 13 } 14 int main() 15 { 16 int cnt,i,m,j,T,tmp,sqr; 17 long long ans; 18 memset(vis,0,sizeof(vis)); 19 for (i=2,cnt=0,vis[1]=1;i<=100000;i++) 20 if (vis[i]==0) 21 { 22 prime[++cnt]=i; 23 for (j=2;i*j<=100000;j++) vis[i*j]=1; 24 } 25 scanf("%d",&T); 26 while (T--) 27 { 28 scanf("%d%d",&m,&n); 29 if (m>n) {tmp=m; m=n; n=tmp; } 30 ans=0; 31 for (i=1;i<=m;i++) 32 { 33 num=0; k=i; sqr=(int)sqrt(1.0*k); 34 for (j=1;j<=cnt&&prime[j]<=sqr&&prime[j]<=k;j++) 35 if (k%prime[j]==0) 36 { 37 a[++num]=prime[j]; 38 while (k%prime[j]==0) k/=prime[j]; 39 } 40 if (k!=1) a[++num]=k; 41 for (j=1,k=0;j<=num;j++) 42 dfs(j,1,a[j]); 43 ans=ans-k+n; 44 } 45 printf("%I64d\n",ans); 46 } 47 return 0; 48 }