UVA 11426 GCD Extreme (II) 歐拉函數

1)歐拉函數φ(n)爲所有小於n的正整數與n的GCD和,φ(n)=n*(1-1/a1)*(1-1/a2)......(a1,a2...爲n的約數)

2)若對於B有n個數與其互質,則循環到i*B則可爲pe[i*B]增加pe[B]*i

3)最後值即求a[1]+a[2]+....+a[n]

#include <stdio.h>
#include <string.h>
#define N 4000010
int pe[N];
long long num[N];
int main()
{
    int n;
    int i,j;
    for(i=1;i<N;i++) 
        pe[i]=i;
    memset(num,0,sizeof(num));
    for(i=2;i<N;i++)
    {
        if(pe[i]==i)
        {
            for(j=1;j*i<N;j++)
                pe[i*j]=pe[i*j]/i*(i-1);
        }
        for(j=1;j*i<N;j++)
            num[i*j]+=pe[i]*j;
        num[i]+=num[i-1];
    }
    while(scanf("%d",&n)!=-1)
    {
        if(n==0)
            break;
        printf("%lld\n",num[n]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章