luogu P2568 GCD

Posted gzygzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P2568 GCD相关的知识,希望对你有一定的参考价值。

luogu P2568 GCD

[sum_{i=1}^nsum_{j=1}^m[gcd(i,j)==p]]

完全可以套用YY的GCD方法来做.这里有一个十分好用的思想与方法.
[sum_{p}sum_{i=1}^{frac np}sum_{j=1}^{frac mp}[gcd(i,j)==1]]
[sum_{p}sum_{i=1}^{frac np}phi(i) * 2 - 1]
只要筛出函数(phi(i))
那么就可以在(O(pi (n)))的时间内求得

#include <iostream>
#include <cstdio>
#define rep(i , x, p) for(register int i = x;i <= p;++ i)
#define gc getchar()
#define pc putchar
#define ll long long
const int maxN = 1e7 + 7;

int num , prime[maxN], phi[maxN];
bool is_prime[maxN];
ll sum[maxN];

inline void init(int n) {
    phi[1] = 1;
    rep(i , 2, n) {
        if(!is_prime[i]) prime[++ num] = i , phi[i] = i - 1;
        for(register int j = 1;j <= num && i * prime[j] <= n;++ j) {
            is_prime[i * prime[j]] = true;
            if(i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * ( prime[j] - 1 );
        }
    }
    rep(i , 1, n) sum[i] = sum[i - 1] + phi[i];
}

int main() {
    int n;
    scanf("%d",&n);
    init(n);
    long long ans = 0;
    rep(i , 1, num) ans += sum[n / prime[i]] * 2 - 1;
    printf("%lld",ans);
    return 0;
}




以上是关于luogu P2568 GCD的主要内容,如果未能解决你的问题,请参考以下文章

P2568 GCD

P2568 GCD

Copy自某谷题解UVA11417 GCD

luogu2658 GCD(莫比乌斯反演/欧拉函数)

「Luogu2257」YY的GCD

luogu2568GCD题解--欧拉函数