题意:x在1到n之间,求满足条件的gcd(x,n)>=m的x个数
题解:设n=p*d ; x= q *d ; d为gcd(x,n) 则p与q互质。所以我们只需求d>=m时的 p,与p互质的数就是q的取值,即为x的取值 ,所以(n/p)的和即为答案。
#include<cstdio>
#include<cstring>
#include<cmath>
const int N=1e6;
int num[N];
int phi(int n)
{
int sum=n;
int m=(int)sqrt(n+0.5);
for(int i=2;i<=m;i++)
{
if(n%i==0)
{
sum=sum/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) sum=sum/n*(n-1);
return sum;
}
int main()
{
int i,n,m,ncase;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%d",&n,&m);
int top=0;
for(i=1;i*i<=n;i++)
{
if(n%i==0)
{
if(i>=m) num[top++]=i;
if(i==n/i) continue;
if(n/i>=m) num[top++]=n/i;
}
}
int sum=0;
for(i=0;i<top;i++)
{
sum+=phi(n/num[i]);
}
printf("%d\n",sum);
}
return 0;
}
hdu 2504 gcd(a,c)=b ,且b!=c ,给你a和b的值求最小的 c 。
a=x*b ,c=y*b ,只要求与x互质的最小的那个数 1 除外