题意:给定N(1 < N < 4000001)求
G=0;
for(i=1;i<N;i++)
{
for(j=i+1;j<=N;j++)
{
G+=gcd(i,j);
}
}
G=?
思路:phi函数打表+递推。
参考代码来源:这里
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long maxn=4100000;
long long phi[maxn*2];
long long s[maxn],f[maxn];
void phi_table(int n)
{
for(int i=2;i<=n;i++)phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++)
if(!phi[i])
for(int j=i;j<=n;j+=i)
{
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
int main()
{
phi_table(maxn);
memset(f,0,sizeof(f));
for(int i=1;i<=maxn;i++)
for(int j=i+i;j<=maxn;j+=i)//最大公约数不能为本身
f[j]+=i*phi[j/i];
memset(s,0,sizeof(s));
s[1]=0;
for(int i=2;i<=maxn;i++)
s[i]=s[i-1]+f[i];
int n;
while(scanf("%d",&n),n)
{
printf("%lld\n",s[n]);
}
return 0;
}