數論 線性篩 約數個數與約數和

2021-10-24 12:48:05 字數 2479 閱讀 5642

參考部落格

參考部落格

參考部落格

這個講的挺好

預備知識點:

大於1的數n可以分解質因數:

n=p1a1×p2a2×p3a3*…*pka

n的約數的個數是(a1+1) * (a2+1) * (a3+1)…(ak+1)

我們先用線性篩來篩出素數

bool mark[maxn]

;int prim[maxn]

;int cnt;

void

initial()

}}

n的約數的個數是(a1+1) * (a2+1) * (a3+1)…(ak+1)

我們可以用線性篩篩出當前n的約數個數

證明:

d[i]表示i的約數的個數

num[i]表示i的最小素因子的個數

prim[i]表示第i個素數

分下列情況:

i為質數

因為i為質數,所以素因子只有本身,且指數為1

所以num[i]=1,d[i]=2(1和本身)

i%prim[j]!=0

說明i不包含prim[j]這個素因子,但是i*prim[j]包含乙個素因子prim[j],所以

d(i∗prime[j])=(1+r1)∗……∗(1+rk)∗(1+1)=d[i] * d[prim[j]] = d[i] * 2

而且因為我們是從小到大列舉,所以當前的prim[j]必然是i * prim[j]的最小素因子,所以num[i * prim[j]] = 1

i%prim[j]= =0

i中包含prim[j],且為i的最小素因子

d(i∗prime[j])=(1+r1+1)∗……∗(1+rk)

d(i∗prime[j])=d(i)/(num(i)+1)∗(num(i)+2)

num(i∗prime[j])=num(i)+1

#include

#include

#include

using

namespace std;

const

int wx=

1017

;int isprime[wx]

,prime[wx]

,d[wx]

,num[wx]

;int tot,n,m;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return sum*f;

}void

euler()

for(

int j=

1;j<=tot&&i*prime[j]

<=n;j++

)else}}

}int

main()

我們用sd(i)表示i的約數和

根據算數基本定理:

sd(n)=(1+p1+p21+……+pr11)∗(1+p2+p22+……+pr22)∗……∗(1+pk+p2k+……+prkk)

最小質因子的那一項是(1+p1+p21+……+pr11)

我們用num[i]來表示最小質因子的那一項

證明:

和上面一樣分類討論:

i為素數

sd(i)=i+1num(i)=i+1

i%prim[j] ! = 0

i∗prime[j]裡原先沒有prime[j]這一項,加上後:

sd(i∗prime[j])=sd(i)∗sd(prime[j])

num(i∗prime[j])=1+prime[j]

(大體思路如上)

i%prim[j] = =0

d(i∗prime[j])=(d(i)/num(i)∗(num(i)∗prime[j])+1

num(i∗prime[j])=num(i)∗prime[j]+1

#include

#include

#include

using

namespace std;

const

int wx=

1017

;inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return sum*f;

}int isprime[wx]

,sd[wx]

,num[wx]

,prime[wx]

;int n,tot;

void

euler()

for(

int j=

1;j<=tot&&prime[j]

*i<=n;j++

)else}}

}int

main()

線性篩2 篩約數個數

根據唯一分解定理 n p 1 p 2 p q 任意質因子的任意次冪都可以隨意組合,所以根據乘法原理 n 的約數個數為 1 k 1 1 k 2 1 k 3 1 k q so,可以根據這個線性篩約數個數 首先設 num i 為 i 的 k 1 也就是最小質因數的指數 d i 為 i 的約數個數 然後根據...

數論 約數個數

這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求a b之間每個數的約數個數的總和。input 一行兩個正整數a b,以乙個空格隔開。output 一行乙個整數,即答案。資料範圍 對於50 的資料,1 a b 1000 對於100 的資料,1 a b 10,000,0...

數論雜記 約數個數定理

例題 codeforces 1325e 1.題目解釋每個數的因數個數不超過7個,說明了每個數最多只有2個質因數,因為如果有3個質因數的話,那麼 f n 1 1 3 8 7不成立了。2.求出的答案要使得乘積為完全平方,因此答案的質因數個數必須為偶數個,即a1 a2 要為偶數。3.答案的質因數個數必須為...