给定N,M(2<=N<=1000000000, 1<=M<=N), 求1<=X<=N 且gcd(X,N)>=M的个数。
首先,gcd(x,n)一定是n的约数,且gcd>m那么就枚举n大于m的约数算就行,就是phi【n/d】,
注意,不能直接phi【n/m】因为m不一定是n的约数!!!!!!
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<cctype>
using namespace std;
typedef long long ll;
int n,m;
int phi(int n)
{
if (n==1) return 1;
int ans=n,sq=(int)sqrt(n);
for (int i=2;i<=sq;i++)
if (n%i==0)
{
ans=ans/i*(i-1);
while (n%i==0) n/=i;
}
if (n>1) ans=ans/n*(n-1);
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
int ans=0;
for (int i=1;n/i>=m;i++)
if (n%i==0)
{
ans+=phi(i);
}
printf("%d\n",ans);
}
return 0;
}