HDU2824歐拉公式之打表演算法

來源:互聯網
上載者:User

 

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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.