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...