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;
}
浙公网安备 33010602011771号