欧拉函数

1、定义:    对于正整数n,φ(n)是小于n的正整数中,与n互质的数的数目;

例如: φ(8= 4, 因为1,35,7均和8互质。
性质:  
1.    若p是质数,φ(p)= p-1.
          2.    若n是质数p的k次幂,φ(n)= (p-1)p^(k-1)   
          3.    欧拉函数是积性函数,若m,n互质,φ(mn)= φ(m)φ(n)
               根据这3条性质我们就可以退出一个整数的欧拉函数的公式,因为一个数总可以一些质数的乘积的形式。
               E(k) 
= (p1-1)(p2-1)…(pi-1)*(p1^(a1-1))(p2^(a2-1))…(pi^(ai-1))
                        
= k*(p1-1)(p2-1)…(pi-1)/(p1*p2*…pi)
      
                  = k*(1-1/p1)*(1-1/p2)…(1-1/pk)

hdu  2824  The Euler function  求一段连续序列的欧拉函数之和

View Code
#include<cstdio>
#include
<cstring>
#include
<cstdlib>
#include
<iostream>
#include
<string>
#include
<algorithm>
#include
<queue>
#include
<set>
#include
<cmath>
#include
<map>
#define inf 0x3fffffff
#define ll __int64
#define eps 1e-10
#define pi acos(-1.0)
#define N 3000000
usingnamespace std;
int pr[N+5];
bool tag[3000005];
ll phi[N
+5];
void get_prime()
{
int i,j;
int cnt=0;
for(i=2;i<=N;i++)
{
if(!tag[i]) pr[++cnt]=i;
for(j=1;j<=cnt&&pr[j]*i<=N;j++)
{
tag[i
*pr[j]]=1;
if(i%pr[j]==0) break;
}
}
pr[
0]=cnt;
}
void get_phi()
{
int i,j;
phi[
1]=1;
for(i=2;i<=N;i++)
{
if(!tag[i]){ phi[i]=i-1;continue;}
for(j=1;j<=pr[0]&&pr[j]*pr[j]<N;j++)
{
if(i%pr[j]) continue;
int k=i/pr[j];
if(k%pr[j]==0) phi[i]=pr[j]*phi[k];
else phi[i]=(pr[j]-1)*phi[k];
break;
}
}
}
int main()
{
int i,j;
get_prime();
get_phi();
phi[
0]=0;
for(i=1;i<=N;i++)
{
phi[i]
+=phi[i-1];
}
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf(
"%I64d\n",phi[b]-phi[a-1]);
}
return0;
}









 

 

 

 

posted @ 2011-08-21 15:58  hhddff  阅读(161)  评论(0)    收藏  举报