HDU 2824 The Euler function
歐拉φ函數:φ(n)是所有小於n的正整數裡,和n互素的整數的個數。n是一個正整數。
歐拉證明了下面這個式子:
如果n的標準素因子分解式是p1^a1*p2^a2*……*pm^am,其中眾pj(j=1,2,……,m)都是素數,而且兩兩不等。則有
φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm)
如果n為奇素數,φ(n)=n-1.
解法:線性篩選法
在程式中利用歐拉函數如下性質,可以快速求出歐拉函數的值(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>__int64 num[3000024];int 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,i;eular();//結果儲存在num[]中for(i = 3;i <=3000000;i++)num[i] = num[i-1] + num[i];while( scanf( "%d%d",&n,&m )!=EOF )printf( "%I64d\n",num[m]-num[n-1] );return 0;}