其他分享
首页 > 其他分享> > 洛谷P1390 公约数的和 欧拉函数+容斥+线性筛

洛谷P1390 公约数的和 欧拉函数+容斥+线性筛

作者:互联网

洛谷P1390 公约数的和

标签

前言

简明题意

思路

注意事项

总结

AC代码

#include<cstdio>

const int maxn = 2e6 + 10;

bool no_prime[maxn];
int prime[maxn], phi[maxn];
long long pre[maxn];
int shai(int n)
{
    int cnt = 0;
    phi[1] = 1;

    for (int i = 2; i <= n; i++)
    {
        if (!no_prime[i])
            prime[++cnt] = i, phi[i] = i - 1;

        for (int j = 1; j <= cnt && prime[j] * i <= n; j++)
        {
            no_prime[prime[j] * i] = 1;
            phi[prime[j] * i] = (i % prime[j] == 0) ? phi[i] * prime[j] : phi[i] * (prime[j] - 1);
            if (i % prime[j] == 0) break;
        }
    }

    for (int i = 1; i <= n; i++)
        pre[i] = pre[i - 1] + phi[i];

    return cnt;
}

void solve()
{
    long long n;
    scanf("%lld", &n);
    shai(n);

    long long ans = 0;
    for (int d = 1; d <= n; d++)
        ans += (2 * pre[n / d] - 1) * d;
    printf("%lld\n", (ans - (1 + n) * n / 2) / 2);
}

int main()
{
    solve();
    return 0;
}

标签:phi,frac,gcd,ngcd,sum,nd,容斥,P1390,洛谷
来源: https://www.cnblogs.com/danzh/p/11296659.html