CH 3101 階乘分解 質因數分解

2021-10-09 07:51:16 字數 2804 閱讀 7772

題目鏈結

給定整數 n(1 ≤ n ≤ 106

10^6

106),試把階乘 n! 分解質因數,按照算術基本定理的形式輸出分解結果中的 p

ip_i

pi​ 和 c

ic_i

ci​ 即可。

任何乙個大於 1 的正整數都能唯一分解成有限個質數的乘積,可寫做:

n =p

1c1p

2c2.

..pm

cm

n = p_^p_^...p_^

n=p1c1

​p2c

2​..

.pmc

m​其中 cic_

ci​ 都是正整數,pip_

pi​都是質數,且滿足p

1

<..

.

p_1 < p_2 < ... < p_m

p1​​<..

.​。試除法:

結合質數判定的「試除法」和質數篩選的「eratosthenes篩法」,我們可以掃瞄 2 ~ ⌊n1

/2

⌋\lfloor n^ \rfloor

⌊n1/2⌋

的每個數d,若d能整除n,則從n中除掉所有的因子d,同時累計除去d的個數。

因為乙個合數的因子一定在掃瞄到這個合數之前就從n中被除掉了,所以在上述過程中能整除n的一定是質數,最終就到了質因數分解的結果,易知時間複雜度為o(n

1/2)

o(n^)

o(n1/2

)。若把1 ~ n每個數都分解質因數,再把結果合併,時間複雜度過高,為o(n

n1/2

)o(nn^)

o(nn1/

2),顯然,n !的每個質因子都不會超過n,我們可以先篩選出1~n的每個質數p,然後考慮階乘n !中一共包含多少個質因子p。

n !中質因子p的個數就等於1 ~ n每個數包含質因子p的個數,在1 ~ n中,p的倍數,即至少包含 1 個質因子 p 的顯然有 ⌊n/

p⌋

\lfloor n / p \rfloor

⌊n/p

⌋個,而p

2p ^ 2

p2的倍數,即至少包含兩個質因子p的有⌊n/

p2

⌋\lfloor n / p ^ 2 \rfloor

⌊n/p2⌋

個。不過其中的乙個質因子已經在⌊n/

p⌋

\lfloor n / p \rfloor

⌊n/p

⌋裡統計過了,所以只需要在統計第二個質因子,即累加上⌊n/

p2

⌋\lfloor n / p^2 \rfloor

⌊n/p2⌋

,而不是2 * ⌊n/

p2

⌋\lfloor n / p^2 \rfloor

⌊n/p2⌋

。綜上所述:n !中質因子p的個數為:

⌊ np

⌋+⌊n

p2⌋+

⌊np3

⌋+..

.+⌊n

p⌊lo

gpn⌋

⌋=∑p

k≤n⌊

npk⌋

\lfloor \frac \rfloor + \lfloor \frac \rfloor + \lfloor \frac \rfloor + ... + \lfloor \fracn \rfloor}} \rfloor = \sum_ \lfloor \frac \rfloor

⌊pn​⌋+

⌊p2n

​⌋+⌊

p3n​

⌋+..

.+⌊p

⌊log

p​n⌋

n​⌋=

pk≤n

∑​⌊p

kn​⌋

對於每個p,只需要o(l

og2n

)o(log_2n)

o(log2

​n)計算上述和式,故對於整個 n ! 分解質因數複雜度為o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#pragma gcc optimize(2)

using

namespace std;

typedef

long

long ll;

//cout << fixed << setprecision(2);

//cout << setw(2);

const

int n =

1e6+

6, m =

1e9+7;

bool vis[n]

;int prime[

200000

], c[

200000];

intmain()

}for

(int i =

0; i < cnt; i++

)for

(int i =

0; i < cnt; i++

)return0;

}

CH3101 階乘質因數分解

題意 3101 階乘分解 0x30 數學知識 例題 描述給定整數 n 1 n 10 6 試把階乘 n 分解質因數,按照算術基本定理的形式輸出分解結果中的 p i 和 c i 即可。輸入格式 乙個整數n。輸出格式 n 分解質因數後的結果,共若干行,每行一對pi,ci,表示含有pi ci項。按照pi從小...

階乘質因數分解

時間限制 3000 ms 記憶體限制 65535 kb難度 2 描述 給定兩個數n,m,其中m是乙個素數。將n 0 n 2 31 的階乘分解質因數,求其中有多少個m。注 為求冪符號。輸入 第一行是乙個整數s 0 輸出輸出m的個數 樣例輸入 3 100 5 16 2 1000000000 13 樣例輸...

質因數分解

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