链接:https://vjudge.net/contest/276155#problem/O
题意:给出n,求gcd(i,j)得总和(i重1到n-1,j重i+1到n-1)
用欧拉函数求出数量 很巧妙
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 4000001;
typedef long long LL;
int phi[MAXN];
LL ans[MAXN];
void init()
{
memset(ans, 0x00, sizeof(ans));
for (int i = 1; i < MAXN; i++) phi[i] = i;
for (int i = 2; i < MAXN; i++) {
if (phi[i] == i) {
for (int j = i; j < MAXN; j += i) {
phi[j] = phi[j] / i * (i - 1);
}
}
for (int j = 1; j * i < MAXN; j++) {
ans[j * i] += j * phi[i];
}
}
for (int i = 1; i < MAXN; i++) ans[i] += ans[i - 1];
}
int main()
{
init();
int n;
while (scanf("%d", &n), n) {
printf("%lld\n", ans[n]);
}
return 0;
}