例如现在我们求解:
∑
i
=
1
n
⌊
n
i
⌋
\sum_{i=1}^{n} \lfloor \frac{n}{i} \rfloor
i=1∑n⌊in⌋
其中,
⌊
⌋
\lfloor \rfloor
⌊⌋是向下取整的意思。
现在跟着小熊同学一起来思考,我们现在知道15/4=3 15/5=3
如果我们知道i=3和i=4时候,是相同的,那么我们知道总共有2个值为3的数列,直接3*2即可。
现在让我们更一般化的来思考这个问题。
例如,我们现在已经知道了: n i = c \frac{n}{i}=c in=c,那么,会不会存在一个 t t t也可以做到, n t = c \frac{n}{t}=c tn=c并且,t>c,且当t+1的时候,就刚好不满足于公式。
那么计算 t t t的方式简直小菜一蝶,直接:n/c 即(n/(n/i))。
请看下图:
因为i=4的时候,还剩一片,才能沾满15。而,i=5的时候,一片不剩,那么便是。、成功。已经挤压它挤不出来了,这个操作就是n/c。
c可以是最大化的。
我们,就是想知道。t值而已啦~
现在给出完整的代码,请自行参考:
ll getsum(ll n) {
ll sum = 0;
for (int l = 1; l <= n; l = r + 1) //左指帧
{
r = n / (n / l); //右指帧
sum += (r - l + 1) * (n / l);
}
return sum;
}