整除分块

整除分块

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\)

posted @ 2021-01-09 21:10  Realityang  阅读(54)  评论(0编辑  收藏  举报