階乘分解 (素數)

2021-09-25 19:21:10 字數 1214 閱讀 2862

題目:

給定整數 n ,試把階乘 n! 分解質因數,按照算術基本定理的形式輸出分解結果中的 pipi 和 cici 即可。

輸入格式

乙個整數n。

輸出格式

n! 分解質因數後的結果,共若干行,每行一對pi,cipi,ci,表示含有pciipici項。按照pipi從小到大的順序輸出。

資料範圍

1≤n≤1061≤n≤106

輸入樣例:

5
輸出樣例:

2 3

3 15 1

樣例解釋

5!=120=23∗3∗5

解題報告:顯然直接暴力去求解n!,在進行質數分解,和分別求解1-n中的每個數分別進行質數分解的時間複雜度都非常的大,顯然不是很合適。可以知道n!的每個質因子都在1-n之間,先進行一下1-n的質因子篩選,然後去考慮n!中一共含有多少個素因子p。

n!中質因子p的個數為:[n/p]+[n/p^2]+[n/p^3]+……+n[p^k];

可能看到這個式子在各種題解都是直接說可以求得,但是為什麼呢,思考了好久,其實之前咱們去求解n!分別去列舉每個數的質因子分解是按照列的方式去進行的,而上述公式則是按照行的方式去求解,雖然最後的結果是一樣的,但是思考方式是不同的,比如:

求解8!中2的數目:

按照列的方式去求解: 2   1

4    2

6    1

8    3

最後是1+2+1+3=7;

按照行的方式去求解: 1 2 3 4 5  6 7 8

1    1     1    1  (2^1)

1           1    (2^2)

1    (2^3)

最後是4+2+1=7;

可能還是對於這個求解方式還有一定的思考空間,慢慢思考再來補齊吧!

附上普遍ac**:

#includeusing namespace std;

typedef long long ll;

const int maxn=1e6+1000;

int prime[maxn];

bool vis[maxn];

int cnt;

void db_onion()

return res;

}int main()

cout<} }

}

問題 A 階乘分解

題目描述 給定整數n 1 n 10 6 試把階乘n 分解質因數,按照算術基本定理的形式輸出分解結果中的pi和ci即可。輸入乙個整數n。輸出n 分解質因數後的結果,共若干行,每行一對pi,ci,表示含有pi ci項。按照pi從小到大的順序輸出。樣例輸入 複製樣例資料 5樣例輸出 2 33 1 5 1提...

階乘因式分解

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

階乘因式分解

描述 給定兩個數m,n,其中m是乙個素數。將n 0 n 10000 的階乘分解質因數,求其中有多少個m。輸入 第一行是乙個整數s 0 輸出輸出m的個數。樣例輸入 2 100 5 16 2 樣例輸出 24 15 includeint main printf d n sum return 0 剛看到這道...