题意:给定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; }