HDU 2588 GCD——欧拉函数

题意:

输入 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;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/80285121