对于一个数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; }