C X的因子鏈(數論 素數篩法 混合排列)

2021-10-24 14:48:33 字數 1286 閱讀 4600

輸入正整數 x,求 x 的大於 1的因子組成的滿足任意前一項都能整除後一項的嚴格遞增序列的最大長度,以及滿足最大長度的序列的個數。

輸入格式

輸入包含多組資料,每組資料佔一行,包含乙個正整數表示 x。

輸出格式

對於每組資料,輸出序列的最大長度以及滿足最大長度的序列的個數。每個結果佔一行。

資料範圍

1≤x≤220

輸入樣例:23

410100輸出樣例:

1 11 1

2 12 2

4 6想要因子鏈最長,且前一項是後一項倍數,先只考慮第乙個要求,想要因子鏈最長,倍數盡量取小就行,倍數取質因子時是最小,再考慮第二個要求,前一項是後一項倍數,本來每項就都是因子,再結合之前的思考,把x的質因數都求出來,組合成若干項且每項除前一項都為乙個質因子,就可以得到最長因子鏈。因為每項除前一項的商是乙個質因子,於是這個數列可以等效為x的質因子的排列問題,我們要求出x的所有質因數,然後再求它們不同的排列有幾個。

ac**:

#include

const

int n=(1

<<20)

+10;int primes[n]

,cnt;

//存所有質數

int st[n]

;//當前這個數有沒有被篩過

int fact[30]

,sum[n]

;//存所有質因數以及其出現次數

int minp[n]

;//存某個數最小質因數

intget_primes

(int n)}}

intmain()

++k;

}long

long ans=1;

//計算答案

//以每個元素都是獨一無二的眼光,進行全排列

for(

int i=

1;i<=tot;

++i) ans*

=i;//相同的質因數的排列順序無所謂,除以它們的全排列

for(

int i=

0;i++i)

for(

int j=

1;j<=sum[i]

;++j)

ans/

=j;printf

("%d %lld\n"

,tot,ans);}

return0;

}

數論 多種素數判斷法及素數篩法

水了一篇啊.眾所周知,大於等於 2 的僅含有 1 和自身這兩個因子的正整數被稱作素數 故只要判斷在 2,n 1 範圍內是否存在其它因子,就可以判斷 n 是否為素數了 無腦判斷法直接從 2 for到 n 1 稍微優化下可以縮減到 2,frac n 2 但這個方法時間複雜度為 o n 可以發現,如果某個...

數論 線性素數篩(尤拉法)

任何合數都能表示成一系列素數的積。線性素數篩的主要思想是每個合數必有乙個最小素因子,每個合數僅被它的最小素因子篩去正好一次,所以為線性時間。比如說 12 只能被 2 篩掉,12 2 6,不能被3篩掉,12 3 4 中體現在 if i prime j 0 break prime陣列中的素數是遞增的,當...

(數論)素數的幾種基本篩法整理歸納

為了寫幾個模板提供以後ctrl c ctrl v 1.這種篩法是我們最開始接觸語言的時候用的最基本的方法 int getprime int n return 0 3.利用數論之中的定理整數唯一分解定理來做 vecto ctor int n if x 1 ret.push back x return ...