因數分解詳解

2021-10-05 00:19:08 字數 2197 閱讀 5535

考慮下面乙個問題:

題目描述

q次詢問,每次將n質因數分解。

輸入格式

第一行輸入q,表示詢問的次數。

第二至第q+1行,每行輸入n,表示需要進行質因數分解的數。

輸出格式

對於每次詢問,將n分解質因數。

樣例輸入/輸出

input312

2310

1000000007

output

3=1×3

12=2^2×3

2310=2×3×5×7×11

1000000007=1000000007

資料範圍

本題採用**測試。

subtask 1(10pts): t≤10

,n

≤10000

t≤10, n≤10000

t≤10,n

≤100

00subtask 2(20pts): t

≤100,n

≤100000

t≤100, n≤100000

t≤100,

n≤10

0000

subtask 3(40pts): t

≤100,n

≤1005

t≤100, n≤100^5

t≤100,

n≤10

05subtask 4(30pts): t

≤500,n

≤1006

t≤500, n≤100^6

t≤500,

n≤10

06對於每次詢問,直接從1列舉到n;如果列舉到的那個數為質數,那麼就看n是否能被它整除;如果可以就不停地將n除以它,直到不能除(即n無法被它整除)為止。

時間複雜度: o(tnl

og

ntnlogn

tnlogn

)。如果您現在還在用這種方法判素數,那麼您就是萌新。

容易發現根本就不需要判素數。原因如下:

如果這個數i能否拆分為一些數的乘積,且i能被n整除;那麼i的所有因數就一定能被n整除。而之前已經列舉過了n的真因數(乙個數的真因數為它的所有因數除去1和它自己),所以如果i不是質數那麼n就一定不能被i整除。

去掉判素數的步驟即可。

時間複雜度: o(tntn

tn)。如果您現在還在用這種方法判素數,那麼您就是普及組能力以下的選手。

注意到,我們只需要把i從1列舉到n的平方根(sqrt(n))。經過這複雜度為o(sqrt(n))的列舉過後,n必定是乙個質數或是1.

原因顯然,自己舉幾個例子就明白了。

時間複雜度: o(tsq

rt(n

)t sqrt(n)

tsqrt(

n))。如果您在用這種方法進行單個數的質因數分解,那麼我就不能估計您的能力了;

如果您還在用這種方法進行多個數的質因數分解,那麼您就是普及組選手 (話說我不是嗎)

這是質因數分解,所以我們只需要列舉質數能否被n整除。

那麼,我們就可以提前用篩除sqrt(maxn)以內的質數,然後到時候只需要列舉這些質數能否被n整除就好啦。

當然,我們還要記住這句話 :我們只需要把i從列舉在n的平方根(sqrt(n))以內的質數。經過這複雜度遠小於o(sqrt(n))的列舉過後,n必定是乙個質數或是1。

注意到這一步是常數優化,但是往往這也是最重要的一步。

順便提一句,這題中盡量要用尤拉篩,否則特別容易被卡常。

2015.12.11: 學會質數

2016.4.23: 學會分解質因數

2019.3.12: 首次用c++分解質因數,用了subtask 1的思路

2019.11.12 感謝b6e

0b6e0

b6e0

大佬,幫我進化到了subtask 2

2019.11.12 感謝be60

be60

be60

大佬,幫我進化到了subtask 3

2020.4.13 感謝自己,幫我自己優化到了subtask 4

ps: 不要跟我說打表,預處理這樣的話。

求點贊關注啊……

質因數分解

題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...

質因數分解

短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...

質因數分解

講乙個數分解為幾個質數相乘的結果 int a maxn 用來存質因數 int b maxn 用來存質因數的個數 int main if n 1 不能忘記這一步操作 輸出 第1種寫法 a a a b b b b c c printf 第一種寫法 for int i 1 i tot i else pri...