题意:
输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数。
思路:
假设s=gcd(X,N),即s需要>=M;
假设s*a=X,s*b=N,既然s为X与N的最大公约数,不难推出a和b是互质的,又因为X比N小,那么a一定比b小;
于是我们得到的信息有:a比b小,a还和b互斥。那么a的个数,即为b的欧拉函数值。
此题变成了枚举每一个s,b=N/s,在保证s>=M的前提下,累加每一个欧拉函数(b)。
爱吃代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
const double PI=acos(-1.0);
using namespace std;
long long euler(long long n)
{
long long res=n,i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
res=res/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
res=res/n*(n-1);
return res;
}
int main()
{
int t;
long long n,m,ans,i;
cin>>t;
while(t--)
{
cin>>n>>m;
ans=0;
for(i=1;i*i<=n;i++)
{
if(n%i==0)
{
if(i>=m)
ans+=euler(n/i);
if(i*i!=n&&n/i>=m)
ans+=euler(i);
}
}
cout<<ans<<endl;
}
return 0;
}