题解:
大意:给定正整数N,求出G的值。
for(i=1;i<N;i++)
for(j=i+1;j<=N;j++)
G+=gcd(i,j);
我们可以,对N素因子分解,然后用得到的素因子去计算所有n的公约数贡献值。
比如,p=3,n=3, ans+=phi(3)*1;n=3*2, ans+=phi(3)*2;n=3*3, ans+=phi(3)*3.
设一个数组f[],f(i*j)+= phi(i) * j,最后累加。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 4000010
using namespace std;
LL euler[N];
LL sum[N];
void getEuler(){//oula函数表
memset(euler,0,sizeof(euler));
euler[1]=1;
for(int i=2;i<=N;++i){
if(!euler[i]){
for(int j=i;j<=N;j+=i){
if(!euler[j])
euler[j]=j;
euler[j]=euler[j]/i*(i-1);
}
}
}
}
void getSum(){
for(int i=1;i<=N;++i)
for(int j=i*2;j<=N;j+=i)
sum[j]+=euler[j/i]*i;
for(int i=3;i<=N;++i)
sum[i]+=sum[i-1];
}
int main(){
LL n;
getEuler();
getSum();
while(scanf("%lld",&n),n){
printf("%lld\n",sum[n]);
}
return 0;
}