1.自然語言描述
自然數n的尤拉函式指1~n之間所有與n互質的數的個數;比如,6的尤拉函式值為2。
尤拉函式表示式:phi(n) = n * (1 - 1/p1) * (1 - 1/p2) * (1-1/p3) * … * (1-1/pk)
p為質因子的底數。用容斥原理證明:展開這個表示式,phi(n) = n - n/p1 - n/p2 - … - n/pk + n/(p1p2) + n/(p1p3) + … + n/(p(k-1)*pk) - …這樣的形式,即在1~n這n個數中去掉所有不與n互質的數,首先去掉含1個質因子相同的那些數,但這樣做會重複地去掉一些含2個質因子相同的數,所以要補回來(加上),同理這樣做會額外加了含3個質因子相同的數,還得減去它們······直至處理到含所有質因子的數。這樣得到的就是1 ~ n中所有與n互質的數的個數。
篩法求尤拉函式:在素數篩上改動,讓它在篩素數的同時求出每個數的尤拉函式值。
2.**描述
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
intmain
(void)if
(x>1)
res=
(x-1
)*res/x;
cout<}return0;
}
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
1e6+10;
typedef
long
long ll;
int n,primes[maxn]
,cnt,phi[maxn]
;//phi[i]為i的尤拉函式值
bool st[maxn]
;int
main
(void
)for
(int j=
0;primes[j]
<=n/i;j++
) phi[i*primes[j]
]=phi[i]
*(primes[j]-1
); mod pj !=0 :pj仍為i*pj的最小質因子,但未出現過(即phi(i)中未出現(1-1/pj)項)
}//所以phi(i*pj) = pj*phi(i)*(1-1/pj) = phi(i)*(pj-1)
}
ll ans=0;
for(
int i=
1;i<=n;i++
) ans+
=phi[i]
; cout
}
ch3 數學 容斥原理
1.自然語言描述 在概率論課程中,容斥原理作為定理出現過 以最簡單的情況舉例 兩個事件a,b,a b a b a b 三個事件a,b,c,a b c a b c a b a c b c a b c 推廣到任意多個事件 容斥原理可以不重複 不遺漏地得到計算結果。2.描述 include include...
演算法筆記ch3
題目描述 有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的,則規定它們之間的天數為兩天。解題思路 這種求日期之間相差天數的題目有乙個很直接的思路,即令日期不斷加1天,直到第乙個日期等於第二個日期為止,即可統計出答案。如果想要加快速度,只需要先把第乙個日期的年份不斷加1,直到與第二個日期的年份相...
尤拉函式學習
學習尤拉函式首先要理解線性篩。普通的篩法就不記錄了。bool number maxn 5 void isprime int prime maxn 5 int i,j,c 0 memset number,true,sizeof number for i 2 i maxn i if number i p...