HDU 2824 The Euler function

该题刚开始用最原始的方法,先筛出质数,再利用X=( p1-1 )*( p2-1 )*....*( pn-1 )*( p1^( q1-1 ) )*( p2^( q2-1 ) )*...*( pn^( qn-1 ) ),我就测试了一下3--3000000发现要好长的时间我就知道这种方法一定会超时;后来看了解题报告,才知道有如下的线性筛选法( 我个人刚开始不太喜欢线性法,因为我与其比较过其他的筛选法,发现并没有那么快,并且还要开那么大的数组,后来发现线性筛选法可以与好多的题目的结合处理特别好,现在也开始钟情它了 );

在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(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>
#include
<stdlib.h>
int num[3000024],prime[220000];
bool isprime[3000024]={0};
void eular( )
{
int count=0;
__int64 k;
for( int i=2; i<=3000000; i++ )
{

if( !isprime[i] )
{
prime[
++count]=i;
num[i]
=i-1;
}
for( int j=1; j<=count&&( (k=prime[j]*i)<=3000000 );j++ )
{
isprime[k]
=1;
if( i%prime[j]==0 )
{
num[k]
=num[i]*prime[j];
}
else num[k]=num[i]*( prime[j]-1 );
}
}
}
int main( )
{
int n,m;
eular();
while( scanf( "%d%d",&n,&m )!=EOF )
{
__int64 ans
=0;
for( int i=n; i<=m; i++ )
ans
+=num[i];
printf(
"%I64d\n",ans );
}
return 0;
}
posted @ 2011-09-01 14:54  wutaoKeen  阅读(428)  评论(0编辑  收藏  举报