欧拉函数——最大公约数

最大公约数

给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。

GCD(x,y)即求x,y的最大公约数。

输入格式
输入一个整数N

输出格式
输出一个整数,表示满足条件的数对数量。

数据范围
1 ≤ N ≤ 1 0 7 1≤N≤10^7 1N107
输入样例:
4
输出样例:
4

题解:

g c d ( x / p , y / p ) = 1 gcd(x/p,y/p)=1 gcd(x/p,y/p)=1 p为质数
就可以枚举n/ p i p_i pi的欧拉函数了。

#include 
using namespace std;
const int N=1e7+10;
int prime[N],phi[N],cnt;
bool st[N];
long long sum[N];
void init(int n) {
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            prime[cnt++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; prime[j] * i <= n; j++) {
            st[prime[j] * i] = true;
            if (i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
    for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + phi[i];
}
int main()
{
    int n;
    cin >> n;
    init(n);
    long long res = 0;
    for (int i = 0; i < cnt; i ++ ){
        int p = prime[i];
        res += sum[n / p] * 2 + 1;
    }
    cout << res << endl;
    return 0;
}

你可能感兴趣的:(数学)