hdu 2588 欧拉函数
找出N的所有大于等于M的因子(x1,x2,x3.....xi),然后设k=N/xi;
下面只需找出小于k且与k互质的数。
因为:设y与k互质且小于k,那么gcd(y*xi,k*xi)=xi;(xi为N的因子,且xi大于等于M)。
#include<iostream>
using namespace std;
int M,N;
int ans;
inline int eular(int x)
{
int ret=x;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
{
ret=ret/i*(i-1);
while(x%i==0)
{
x/=i;
}
}
}
if(x>1)
ret=ret/x*(x-1);
return ret;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>N>>M;
ans=0;
for(int i=1;i*i<=N;i++)
{
if(N%i==0)
{
if(i>=M)
ans+=eular(N/i);
if(i!=N/i)
{
if(N/i>=M)
ans+=eular(i);
}
}
}
cout<<ans<<endl;
}
return 0;
}