版权声明:欢迎大家转载,转载请注明出处 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;
}