BZOJ 3994 約數個數和 莫比烏斯反演

2021-07-13 04:01:11 字數 1810 閱讀 6481

bzoj 3994 約數個數和

題意:求∑

ni=1

∑mj=

1d(i

∗j),

定義d(

i)為i

的約數個

數.n,

m∈[1

,50000]

分析:an

s=∑g

cd(i

,j)=

1⌊ni

⌋⌊mj

⌋=∑i

=1n⌊

ni⌋∑

j=1m

⌊mj⌋

定義g(n)=

∑ni=

1⌊ni

⌋=∑n

i=1d

(i) ,只需要預處理出g(

n)就可以在o(

n−−√

) 時間範圍內解決問題。如果選擇分步加速的話,預處理的複雜度是o(

nn−−

√),但是其實我們考慮每個數

i 的約數個數,然後g(

n)m 最小質因子的冪次nu

m[m]

,d[m

]記錄m 的約數個數,顯然d(

m)是積性函式.對於m=

i∗pr

ime[

j],如果i%

prim

e[j]

!=0 ,根據積性函式性質nu

m[m]

=1,d

[m]=

d[i]

∗d[p

rime

[j]]

, 否則nu

m[m]

=num

[i]+

1,因為m

的約數個數是:(e

1+1)

∗(e2

+1)∗

...∗

(ek+

1),e

i是質因子分解後各質因子的冪次,我們考慮m 從

i的轉移過程,

m 只比i在

prim

e[j]

的冪次上多

1 ,所以d[

m]=d

[i]n

um[i

]+1]

∗(nu

m[i]

+2).

親測g如果分步加速預處理

6000+m

s,用線性篩

2000+m

s

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int max_n = 50010;

int prime_cnt, prime[max_n], mu[max_n], num[max_n];

ll g[max_n], d[max_n], sum[max_n];

bitset

bs;void getmu()

for(int j = 0; j < prime_cnt && i * prime[j] < max_n; ++j) else }}

for(int i = 1; i < max_n; ++i)

}inline ll solve(int n, int m)

return res;

}int main()

return

0;}

bzoj 3994 SDOI2015 約數個數和

3994 sdoi2015 約數個數和 time limit 20 sec memory limit 128 mb submit 944 solved 653 submit status discuss description 設d x 為x的約數個數,給定n m,求 input 輸入檔案包含多組測...

BZOJ 3994 SDOI2015 約數個數和

設d x 為x的約數個數,給定n m,求 輸入檔案包含多組測試資料。第一行,乙個整數t,表示測試資料的組數。接下來的t行,每行兩個整數n m。t行,每行乙個整數,表示你所求的答案。27 4 5 6110 1211 n,m 50000 1 t 50000 round 1 感謝yts1999上傳 莫比烏...

BZOJ3994 SDOI2015 約數個數和

bzoj3994 sdoi2015 約數個數和 設d x 為x的約數個數,給定n m,求 輸入檔案包含多組測試資料。第一行,乙個整數t,表示測試資料的組數。接下來的t行,每行兩個整數n m。t行,每行乙個整數,表示你所求的答案。27 4 5 6110 1211 n,m 50000 1 t 50000...