UVA

来源:互联网 发布:提现接口网站 php 编辑:程序博客网 时间:2024/06/05 10:07
#include<cstdio>#include<cstring>/*输入一个数n,求解Gfor(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;}