Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
题意:求1~N中与N的最大公约数大于M的个数
设N=a*b,X=a*d;gcd(N,X)==a所以b和d互质因为X<=N所以d为小于等于b的任意数;所以d的数量即为b的欧拉函数值所以只需要枚举a求出b的欧拉函数值即可
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int Eular(int n){
int ret=1,i;
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,i,j,ans,N,M;
scanf("%d",&t);
while(t--){
scanf("%d%d",&N,&M);
ans=0;
for(i=1;i*i<=N;++i){
if(N%i==0){
if(i>=M)ans+=Eular(N/i);
if(N/i>=M&&i*i!=N)ans+=Eular(i);
}
}
printf("%d\n",ans);
}
return 0;
}