例一:bzoj1968: [Ahoi2005]COMMON 约数研究
Description
![](https://i-blog.csdnimg.cn/blog_migrate/e59d27624202a4863d40a95567873cbc.jpeg)
Input
只有一行一个整数 N(0 < N < 1000000)。
Output
只有一行输出,为整数M,即f(1)到f(N)的累加和。
题目分析
答案即为1..x1..x的所有约数个数和。
我们知道换种形式答案就是∑i⌊ni⌋∑i⌊ni⌋。
那么暴力算法来了:所以我们
for (int i=1; i<=n; i++)
ans += n/i;
就好了。
由于n=1e6,所以这个O(n)的算法是能够过去的。但是不行!这个是数论分块的板子题,我们怎么能够止步于O(n)的算法呢?
若用g(i)表示n/i,显然,并且g(i)是并不严格单调的。
自然而然地想到,在求g(i)的同时能不能够求出[i,