GCD
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 979 Accepted Submission(s): 439
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.
3 1 1 10 2 10000 72
1 6 260//eular函数 /*题解:找出所有(x,n)>=m中的大于m的n的因子,x1,x2,x3... 令k=n/i; 找出所有与k互质且小于k的数y,则gcd(ay;ak)=a; 将所有n/eular (k)相加即得结果; */ #include<cstdio> int eular(int n) { int i,ret=1; for(i=2; i*i<=n; i++) { if(n%i==0) n/=i,ret*=i-1; while(n%i==0) n/=i,ret*=i; } if(n>1) ret*=n-1; return ret; } int main() { int T,m,n,i; scanf("%d",&T); while(T--) { int s=0,num[100010]={0},cnt=0; scanf("%d %d",&n,&m); for(i=1; i*i<=n; i++) { if(n%i==0) { if(i>=m&&i*i!=n) num[cnt++]=i; if(n/i>=m&&i*i!=n) num[cnt++]=n/i; if(i*i==n&&i>=m) num[cnt++]=i; } }
for(i=0; i<cnt; i++)
s+=eular(n/num[i]);
printf("%d\n",s);
}
return 0;
}
/*错误代码: 超时
#include<stdio.h>
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int i,n,m,count;
scanf("%d %d",&n,&m);
for(i=1,count=0; i<=n; i++)
{
if(gcd(i,n)>=m)
count++;
}
printf("%d\n",count);
}
return 0;
}*/