问题
∑
i
=
1
n
⌊
n
i
⌋
\sum_{i=1}^n\lfloor \frac{n}{i}\rfloor
i=1∑n⌊in⌋
整除分块
当 n = 10 n=10 n=10时,可以计算:
i | ⌊ 10 / i ⌋ \lfloor 10/i\rfloor ⌊10/i⌋ |
---|---|
1 | 10 |
2 | 5 |
3 | 3 |
4 | 2 |
5 | 2 |
6 | 1 |
7 | 1 |
8 | 1 |
9 | 1 |
10 | 1 |
可以看到表中同样的值会连续出现,整除分块就是根据不同的数值划分出不同的块。假设已知某个分块的左端点为
l
e
f
t
left
left,现要表示出左端点
r
i
g
h
t
right
right,由于在
[
l
e
f
t
,
r
i
g
h
t
]
[left,right]
[left,right]内的数值都为
k
k
k,则有
⌊
n
l
e
f
t
⌋
=
⌊
n
r
i
g
h
t
⌋
\lfloor\frac{n}{left}\rfloor=\lfloor\frac{n}{right}\rfloor
⌊leftn⌋=⌊rightn⌋
令 k = ⌊ n l e f t ⌋ k=\lfloor\frac{n}{left}\rfloor k=⌊leftn⌋,则 r i g h t = ⌊ n k ⌋ right=\lfloor\frac{n}{k}\rfloor right=⌊kn⌋。
def func(n):
ans,left=0,1
while left<=n:
k=n//left
right=n//k
ans+=(right-left+1)*k
left=right+1
return ans
问题
∑
i
=
1
n
n
%
i
\sum_{i=1}^n n \%i
i=1∑nn%i
转换问题:
∑
i
=
1
n
n
%
i
=
∑
i
=
1
n
(
n
−
n
/
/
i
∗
i
)
=
n
∗
k
−
∑
i
=
1
n
n
/
/
i
∗
i
\sum_{i=1}^n n \%i=\sum_{i=1}^n (n-n//i*i)=n*k-\sum_{i=1}^n n//i*i
i=1∑nn%i=i=1∑n(n−n//i∗i)=n∗k−i=1∑nn//i∗i