整除分块
题什么的看here
学莫比乌斯反演总看见整除分块,所以!。。先来学一下整除分块
直接通过给出问题看
求
∑
i
=
1
n
[
n
i
]
,
n
≤
1
0
12
\sum_{i=1}^{n}{[\cfrac{n}{i}]},n\leq10^{12}
i=1∑n[in],n≤1012
首先来说暴力肯定跑不了
然后发现对于
[
n
i
]
[\cfrac{n}{i}]
[in]最多只有
2
n
2\sqrt{n}
2n个值
并且如果
[
n
i
′
]
=
[
n
i
]
[\cfrac{n}{i'}]=[\cfrac{n}{i}]
[i′n]=[in]则
i
′
i'
i′的最大值为
[
n
[
n
i
]
]
[\cfrac{n}{[\frac{n}{i}]}]
[[in]n]
用法就是设
L
=
1
L = 1
L=1,令
R
=
[
n
[
n
L
]
]
R = [\cfrac{n}{[\frac{n}{L}]}]
R=[[Ln]n]。将
(
R
−
L
+
1
)
∗
[
n
L
]
(R - L + 1)*[\cfrac{n}{L}]
(R−L+1)∗[Ln]累加,再令
L
=
R
+
1
L = R + 1
L=R+1
代码如下
for(int l = 1,r;l <= n; l = r+1) {
r = (n/(n/l));
ans += (r-l+1)*(n/l);
}
小技巧:
分块
[
n
i
]
[\cfrac{n}{i}]
[in]
r
=
[
n
[
n
l
]
]
即
r
=
(
n
/
(
n
/
l
)
)
r = [\cfrac{n}{[\frac{n}{l}]}]即r=(n/(n/l))
r=[[ln]n]即r=(n/(n/l))
分块
[
n
i
2
]
[\cfrac{n}{i^{2}}]
[i2n]
r
=
[
[
n
n
l
2
]
]
,
即
r
=
s
q
r
t
(
n
/
(
n
/
l
/
l
)
)
r=\big[\sqrt{[\cfrac{n}{\frac{n}{l^{2}}}]}\ \big],即r=sqrt(n/(n/l/l))
r=[[l2nn] ],即r=sqrt(n/(n/l/l))
分块
⌊
⌊
n
i
⌋
⌋
\lfloor\ \sqrt{\lfloor\cfrac{n}{i}\rfloor}\ \rfloor
⌊ ⌊in⌋ ⌋
r
=
⌊
n
(
⌊
⌊
n
i
⌋
⌋
)
2
⌋
即
r
=
n
/
(
s
q
r
t
(
n
/
l
)
∗
s
q
r
t
(
n
/
l
)
)
r=\lfloor\cfrac{n}{(\lfloor\sqrt{\lfloor\frac{n}{i}\rfloor}\rfloor)^2}\rfloor即r=n/(sqrt(n/l)*sqrt(n/l))
r=⌊(⌊⌊in⌋⌋)2n⌋即r=n/(sqrt(n/l)∗sqrt(n/l))
证明直接上图,用正在学的latex写数学公式好爽,但是好慢。。。字丑了点(何止一点)QAQ敲代码敲得都不会写字了