分解質因數

2022-03-26 19:56:17 字數 894 閱讀 5757

以求高精組合數為例

一般地,對於$n m \leq 10^6$ 可以打素數表,然後在mark i*prime[j]時附上標記prime[j]  其實就是i*prime[j] 的最小質因數,這樣可以在分解時將複雜度控制在$o(logn)$以下。

1

void

get_prime()

210 f(j,1

,pc)

1116

}17 }

線性篩素數並標記

1

while(x!=1)2

對x分解質因數

同理對分母分解,然後我們只要--pz就可以了(組合數是整數,所以我們可以預見分母會被約掉)。

1 f(i,2,n) while(pz[i]--) dcheng(a,i);
高精乘低精

實際上pz有很多下標是無用的,我們可以讓mark存素數的標號(即在prime中的下標)。這樣在n m很大時可以減少上面**的迴圈次數。

以下不是求組合數而單論分解。設x為要分解的數

對於x很大(1e9),我們可以用試除法。

列舉$1~\sqrt$ 對於乙個列舉到的i,除到不能整除為止,記錄因數,顯然這樣得到的因數都是素數。

列舉完後,若x!=1 則將x加入質因子中。

這樣做的正確性:反證法:假設有兩個》sqrt(x)的質因數,那麼將它們相乘會》x,與命題矛盾,得證。

然後我們就可以在$o(\sqrt)$下沒有多開乙個陣列而愉快地解決了問題。

兩種演算法比較:

1.對於要頻繁分解質因數的情況,第一種更優。只要$o(n)$線性篩一遍,然後單次分解$o(logn)$。所以當估計運算元達到$o(\sqrt(n))$直接第一種

2.對於x很大,或分解次數很少的情況,第二種更優。

分解質因數

質因數概念 每個合數都可以寫成幾個質數相乘的形式,這幾個質數就都叫做這個合數的質因數。如果乙個質數是某個數的因數,那麼就說這個質數是這個數的質因數。而這個因數一定是乙個質數。演算法原理 先根據需要分解的合數生成乙個質數表。然後依次從小到大依次除合數,每次除之後都將儲存步驟。表達不好,還是看 吧 us...

分解質因數

分解質因數 問題描述 求出區間 a,b 中所有整數的質因數分解。輸入格式 輸入兩個整數a,b。輸出格式 每行輸出乙個數的分解,形如k a1 a2 a3.a1 a2 a3.k也是從小到大的 具體可看樣例 樣例輸入 3 10 樣例輸出 3 34 2 2 5 56 2 3 7 78 2 2 2 9 3 3...

分解質因數

大數的質因數分解一直以來是亟需解決的難題。本文從最基本的試除法開始,分解質因數的方法。下面的程式在開頭定義了乙個巨集opt,如果刪掉這個定義,就可以執行最原始的演算法。一 樸素演算法 include include include using namespace std define opt int...