本篇隨筆講解資訊學奧林匹克競賽中數學部分的約數相關知識點。大體包括:整數唯一分解定理的推論,求\(n\)的正約數集合,篩選\(1 - n\)每個數的正約數集合。需要讀者有不低於高中一年級的數學素養及一定的邏輯推理能力。本篇隨筆將不再對一些基本定理和數學知識、概念進行講解,有需要的同學請自行補習。
通過質數相關知識點的學習,我們知道了乙個正整數可以被分解成若干質數的乘積,數學表示為:
\[n=\prod_^^
\]將其展開,可以得到:
\[n=1\times p_1\times p_1^2\times\cdots\times p_1^\times \cdots\times p_m^\times p_m^
\]通過約數的定義,我們可知這個展開式中的所有元素都是\(n\)的約數。
那麼,根據乘法原理,\(n\)的約數個數\(t\)就可以表示為:
\[t=(1+c_1)\times(1+c_2)\times\cdots\times(1+c_m)
\]即:
\[t=\prod_^(1+c_i)
\]這就是正整數的正約數個數表示式。
那麼,還是根據正整數的唯一分解定理,\(n\)的所有正約數的和\(s\)就是:
\[s=(1+p_1+\cdots+p_1^)\times\cdots\times(1+p_m+p_m^)
\]即:
\[s=\prod_^^^)}
\]這就是正整數的所有約數和表示式。
我們知道了乙個正整數的約數和和約數個數,但是我們還是不能知道這個正整數的約數到底是什麼。想要知道具體的約數,需要列舉實現。
但是約數有乙個性質:它是成對出現的(完全平方數除外)。
假如乙個正整數\(a\)是\(n\)的約數,且\(a\le\sqrt n\),那麼必然會有乙個正整數\(b\)是\(n\)的約數,且\(b\ge\sqrt n\)。
而且根據約數的性質,我們完全可以斷定,這個\(b\)就是\(\frac\)。
因此,和質數的判定對應地,我們使用試除法。同樣只需要列舉\(1 - \sqrt n\)的所有數,每列舉到乙個可被\(n\)整除的數,就把這個數和\(n\)除這個數所得的數一起加入到約數集合中。
當然,在細節實現上要判一下它是不是完全平方數。
**:
void factor(int n)
}
並且,通過試除法的原理,我們還可以推導出:
乙個數的約數個數的上界為\(2\sqrt n\)
如果用上述方法進行求解,時間複雜度為\(o(n\sqrt n)\),會被卡。根據約數的定義,我們可以推出:對於每個數\(d\),這個\(1 -n\)的數列中以之為約數的數一定是它的倍數。即\(d,2d,3d,4d\cdots\lfloor n/d\rfloor\times d\)。
所以,我們每列舉到乙個數的時候,就直接把它的上述倍數加進**即可。
**:
vectorf[maxn];
void factors(int n)
上述演算法的時間複雜度是\(o(nlogn)\)級別的。 C new delete相關知識點詳解
每個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區 free store 或堆 heap c語言用一堆標準庫函式malloc和free在自由儲存區中分配儲存空間,而c 則用new和delete表示式實現相同的功能。一 new和delete建立和釋放動...
質數相關知識點詳解
上課!定義 若乙個正整數無法被除了1和它自身之外的任何數整除,則稱該數為質數 或素數 否則稱該數為合數。我們需要明確,整個自然數集合中,質數的分布比較稀疏,對於乙個足夠大的整數 n 不超過它的質數大約有 frac 個,換句話說,就是每 ln n 個數中大約有1個質數。我們需要明確,計算機最優秀的地方...
相關知識點
nweb inf uclasses uweb.xml ulib n 從httpservlet 繼承,重寫doget dopost方法 n部署web.xml n 只有乙個物件 n 第一次請求的時候被初始化,只一遍 n 初始化後先呼叫init 方法,只一遍 n 每個請求,呼叫一遍service serv...