#include<cstdio>
#include<cstring>
/*
输入一个数n,求解G
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
G+=gcd(i,j);
既所有满足1<=i<j<=n的数对(i,j)所对应的gcd(i,j)之和
设f(n)=gcd(1,n)+gcd(2,n)+gcd(3,n)+...+gcd(n-1,n)
s(n)=s(n-1)+f(n)
f(n)=sum{i*phi(n/i)|i是n的约数}
对于每个i枚举它的倍数,并且更新f(n)
*/
typedef long long LL;
const int maxn=4e6+5;
LL s[maxn],f[maxn];
int phi[maxn];
//用类似筛法计算phi(n)
void phi_table(int n)
{
for(int i=0;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*2;j<maxn;j+=i)
{
f[j]+=i*phi[j/i];
}
}
s[2]=f[2];
for(int i=3;i<maxn;i++)
{
s[i]=s[i-1]+f[i];
}
int n;
while(scanf("%d",&n)==1&&n)
{
printf("%lld\n",s[n]);
}
return 0;
}
UVA - 11426 GCD - Extreme (II) (欧拉函数)
最新推荐文章于 2021-02-21 16:19:13 发布