初涉数论分块

数论分块:应该算是一类思想

什么是数论分块

我对数论分块的理解就是:在一类要统计$\sum_{i}^{n}{f(i)}$的数学题中,由于$f(i)$是单调的,故存在$x,y \in [i,j]$使得$f(x)=f(y)$。于是只要找到这段区间就可以节省计算区间内每一个函数值的时间开销。

时间复杂度大抵是$O(\sqrt n)$的?

数论分块入门题

bzoj1968: [Ahoi2005]COMMON 约数研究

Description

Input

只有一行一个整数 N(0 < N < 1000000)。

Output

只有一行输出,为整数M,即f(1)到f(N)的累加和。

题目分析

答案即为$1..x$的所有约数个数和。

我们知道换种形式答案就是$\sum_{i}^{}{⌊\frac{n}{i}⌋}$。

那么暴力算法来了:所以我们

1 for (int i=1; i<=n; i++)
2     ans += n/i;

就好了。

由于$n=10^6$,所以这个$O(n)$的算法是能够过去的。

但是不行!这个是数论分块的板子题,我们怎么能够止步于$O(n)$的算法呢?

若用$g(i)$表示$\frac{n}{i}$,显然$ans=\sum_{i=1}^{n}{g(i)}$,并且$g(i)$是并不严格单调的。

猜你喜欢

转载自www.cnblogs.com/antiquality/p/9216301.html