hdu 2824 The Euler function(线性素数筛法同时求欧拉函数)

http://hi.baidu.com/zd987/blog/item/9d2ebc31c64133a45edf0e5c.html


在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因素)
(1) 若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
(2) 若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);

 

#include <stdio.h>

#define MAX 3000005
#define MAXPN 216817

int phi[MAX],pr[MAXPN];

void init()
{
    int i,j,pn=0;
    for(i=2; i<MAX; ++i)
    {
        if(!phi[i])
        {
            pr[pn++]=i;
            phi[i]=i-1;
        }
        for(j=0; j<pn&&pr[j]*i<MAX; j++)
        {
            if(i%pr[j]==0)
            {
                phi[pr[j]*i]=phi[i]*pr[j];
                break;
            }
            else phi[pr[j]*i]=phi[i]*(pr[j]-1);
        }
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
    #endif
    init();
    int a,b;
    __int64 cnt;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        cnt=0;
        while(a<=b) cnt += phi[a++];
        printf("%I64d\n",cnt);
    }
    return 0;
}

posted @ 2010-09-11 09:50  菜到不得鸟  阅读(572)  评论(0)    收藏  举报