题意:
输入 N 和 M (2<=N<=1000000000,1<=M<=N),找出所有的X满足1<=X<=N且 gcd(X,N)>=M.
思路:
首先,求出N的所有约数g[],然后枚举那些>=M 的公约数g[i],结果为 所有n/g[i] 的欧拉函数的值的和
解释:若x>=M,且x是N的约数,故 gcd(x,N)=x>=M
令y=N/x, 则y 的欧拉函数为 小于y的且和y互质的数的个数
设小于y的且和y互质的数为p[1],p[2],p[3]...p[n] ,则 gcd(x*p[i],N)=x>=M
故所有 n/g[i] 的欧拉函数的值的和 就是所求的答案了。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; int euler(int x) { int ans = x; for (int i = 2; i * i <= x; i++) { if (x % i == 0) { ans = ans / i * (i - 1); while (x % i == 0) x /= i; } } if (x > 1) ans = ans / x * (x - 1); return ans; } int main() { int T, n, m; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); ll ans = 1; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { if (i >= m) ans += euler(n / i); if (n / i >= m && i * i != n) ans += euler(i); } } printf("%lld\n", ans); } return 0; }