即計算1~n中與n互素的整數個數
互素就是無法被n整除的數("與p互素"和"不是p的倍數"是等價的)
所以第一種顯而易見的方法就是暴力列舉法,但效率太低。
第二種方法用唯一分解定律再運用容斥原理:
分解定律:分為n=p1^a1*p2^a2......pk^ak;
容斥原理:在計數時,要保證無一重複,無一遺漏。為了使重疊部分不被重複計算,在不考慮重疊的情況下,把包含於某內容中的所有物件的數目先計算出來,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複,這種計數的方法稱為容斥原理。
也即是a∪b∪c=a+b+c-a∩b-b∩c-c∩a+a∩b∩c
於是可以總結出規律:偶數項相加,奇數項相減
所以1~n中與n互素的整數個數= n-p1,p2,p3,p4.....pk的倍數(即-n/p1-n/p2-n/p3...)
+p1*p2,p1*p3....的倍數(即n/(p1*p2)+n/(p1*p3)....)
- p1*p2*p3,p1*p2*p4.......的倍數(即-n/(p1*p2*p3)-n/(p1*p2*p4).....)以此類推
這個數算出來就是尤拉函式,即φ(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn);
嘗試展開這個公式就會發現與上面那個推導的式子一樣,假如從括號中任選乙個值出來乘就會發現偶數項為正,奇數項為負,且項與上式一樣;
對於求φ(n)只需迴圈計算得出值就好了
對於求1~n中所有尤拉函式的值不需要依次計算
#include#include#include#include#include#includeusing namespace std;
void phi_table(int n,int *phi)
}int main()
{ int phi[100+5];
phi_table(100,phi);
for(int i=1;i<=100;i++)
cout<
204統計小於N的質數個數
統計小於n的質數個數 統計所有小於非負整數 n 的質數的數量。示例 輸入 10 輸出 4 解釋 小於 10 的質數一共有 4 個,它們是 2,3,5,7class solution def countprimes self,n int int import math def judge num l ...
小於n與n互質的所有數的和(尤拉函式 快速冪)
尤拉函式的含義 對於正整數n,n 的值表示 小於n並且與n互質 的整數 個數。尤拉函式公式 x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有質因數,x是不為0的整數。性質 1.1 1 2.對於素數p,p p 1 3.小於n並與n互質的數的和...
尤拉函式(求與n互質的數的個數)
求解與n 1 n 1 互質的質因子的個數 注釋 解析 定義 對於正整數 n,n 是小於或等於 n的正整數中,與 n互質的數的數目。例如 8 4,因為1,3 5,7 均和8互質。性質 1.若 p是質數,p p 1.2.若n是質數p的 k次冪,n p 1 p k 1 因為除了 p的倍數都與 n互質 p ...