UVA 11426 GCD - Extreme (II)——筛

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/82469508

虽然可以直接莫比乌斯,不过本着学学别的思路的原则,还是乱筛了一下(其实和莫比乌斯思路挺像)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 4000001;
ll phi[maxn], f[maxn], s[maxn];
void init() {
    phi[1] = 1;
    for (int i = 2; i < maxn; i++) phi[i] = 0;
    for (int i = 2; i < maxn; i++) if (!phi[i]) {
        for (int j = i; j < maxn; j += i) {
            if (!phi[j]) phi[j] = j;
            phi[j] = phi[j] / i * (i-1);
        }
    }
    for (int i = 1; i < maxn; i++) f[i] = 0;
    for (int i = 1; i < maxn; i++) {
        for (int j = i * 2; j < maxn; j += i) {
            f[j] += phi[j/i]*i;
        }
    }
    s[1] = 0;
    for (int i = 2; i < maxn; i++) s[i] = s[i-1] + f[i];
}
int n;
int main() {
    init();
    while (~scanf("%d", &n) && n) {
        printf("%lld\n", s[n]);
    }
    return 0;
}

猜你喜欢

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