整除分块
整除分块
what is it?
我们来专心看一下下面这个式子
\(\sum\limits_{i=1}^n \lfloor \frac n i \rfloor\)
\(in general\),我们会花\(O(n)\)的时间解决
\(however\),我们会发现\(\lfloor \frac {11} 6 \rfloor==\lfloor \frac {11} 7 \rfloor==\lfloor \frac {11} 8 \rfloor\)
换言之,从\(\lfloor \frac n 1 \rfloor\)到\(\lfloor \frac n n \rfloor\),最多只会有\(\sqrt n\)个数(证明有点复杂,可以自行BFS)
我们可以试着去枚举这\(\sqrt n\)个数
然后会发现,同一个数个结尾是\(\lfloor \frac n {\lfloor \frac n i \rfloor} \rfloor\)
那么可以用下面这个代码解决……
int fenk(int n){
int tot=0;
for(int i=1,j;i<=n;i=j+1){
j=n/(n/i);
tot=tot+(n/i)*(j-i+1);
}
return tot;
}
because of the lack of the time
\(That\) \(all\)
Reality&Imagine