对于一个数n 在比它小的数中 除了他的因子 其他数和n的gcd均为1 所有符合题意的数x肯定是n的某个因子的倍数
所以只用看n的所有因子 假设有一个n的因子p大于m 就看(n/p)的欧拉函数值是多少 累加
至于为什么要求(n/p)的欧拉函数 这是为了解决”冲突“ 对于n的因子p和一个与(n/p)不互素的k k*p就会变成n的其他因子或其他因子的倍数 这里需要仔细想想
#include<bits/stdc++.h>
using namespace std;
int geteular(int n)
{
int ans,i;
ans=n;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
ans-=ans/i;
while(n%i==0)
{
n/=i;
}
}
}
if(n>1) ans-=ans/n;
return ans;
}
int main()
{
int t,n,m,i,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
ans=0;
for(i=1;i*i<=n;i++)
{
if(i*i<n)
{
if(n%i==0)
{
if(i>=m) ans+=geteular(n/i);
if(n/i>=m) ans+=geteular(i);
}
}
else
{
if(i>=m) ans+=geteular(i);
}
}
printf("%d\n",ans);
}
return 0;
}