線性篩高階 三 求N的因子個數

2021-10-19 01:49:55 字數 1236 閱讀 3343

演算法思路

首先先完成線性篩函式,然後改寫

#define max_n 1000

int prime[max_n +5]

=;void

init()

for(

int j =

1; j <= prime[0]

; j++)}

return

;}

然後我們進行**公升級

那對於乙個合數能寫出兩個不互素因數積的情況呢(例如: 12 = 2 * 6 // 2 和 6 不互素) 對於這樣的情況, 我們可以證明 :

我們可以把m (12的合數因子6)寫成對於互素因子的乘積, m * p 等於 n . 我們發現 12 的最小素因子的2次冪比 合數因子6的最小素因子的冪次多1 .也就是說 12 是6再乘上6的最小素因子來的. **因此我們可以定義乙個cnt[i]用來記錄最小素因子的冪次

理清思路後,我們用**去實現我們的演算法
#define max_n 1000

int fac[max_n +5]

;//用來儲存數字i的因數個數

int cnt[max_n +5]

;//用來儲存數字i最小素因子的冪次

int prime[max_n +5]

=;void

init()

for(

int j =

1; j <= prime[0]

; j++

)else}}

return

;}

總結 : 利用線性篩演算法框架解決求乙個數的因子個數,它的時間複雜度為 o(n);

思考: 如何利用線性篩框架解決因子和問題,例如 : 4的因子有1,2,4.因此4的因子和為7;

求n 中因子k的個數

思路 求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n 超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n 可以表示成統一的方式。n km m a 其中k是該因子,m n k,a是不含因子k的數的乘積 下面推導這個公式 n n n 1 n 2 3 2 1 k 2...

求n個數 1 n 的質因子

求n個數 1 n 的質因子,我用到了素數篩選法的思想,例如找到素數2,2是2,4,6,8,10 的質因子,3是3,6,9,12 的質因子,然後找到素數5,若是求乙個數n的質因子,請參考 include includeint a 10001 20 b 10001 b i 表示第i個數的質因子個數,a ...

寒假安排 求n !中v因子的個數

b 寒假安排 time limit 1000msmemory limit 64000kb64bit io format lld llu submit status practice acdream 1084 description 寒假又快要到了,不過對於lzx來說,頭疼的事又來了,因為眾多的後宮都...