数论分块小结
概念
下面除法皆表示整除
求:
显然,暴力 \(O(n)\),但有很多结果是相同的,所以可以分段每一段分别处理,大概有 \(\sqrt n\) 段
令这一段的左端点(最小值)为 \(l\),设 \(k=\dfrac n l\),我们要找一个最大值 \(r\) 满足 \(\dfrac n r=k\),显然 \(r=\dfrac n{\frac n l}\),则 \([l,r]\) 的和为 \(\dfrac n l\times (r-l+1)\)
例1 P2261 [CQOI2007]余数求和
数论分块
下面除法默认下取整
显然,对于 \(\frac k i\) 必然是很多段连续的数组成,所以可以分块处理,也就是数论分块。
设当前这一块左端点为 \(l\),结果为 \(a=\dfrac k l\),则 \(r=\dfrac k l=\dfrac k {\frac k l}\),前面乘 \(i\) 可以直接套等差数列求和公式。
时间复杂度 \(O(\sqrt k)\)
例2 牛客网235422 区间最大值
以下分数皆表示整除
显然,当 \(\frac n i\) 一定时,\(i\) 越小越好,所以可以把每个 \(\frac n i\) 求出来,然后数列分块取最小值即可
例3 P3935 Calculating
显然,\(f(x)\) 就是 \(x\) 的因数个数。
设 \(S(n)=\sum_{i=1}^nf(i)\),所以答案在求 \(S(r)-S(l-1)\)
对于任意 \(i\in[1,n]\),它作为小于等于 \(n\) 的数的约数个数为 \(\dfrac n i\)(向下取整),于是 \(S(n)=\sum_{i=1}^n \dfrac n i\)
观察上式,\(S(n)\) 显然可以通过数论分块在 \(O(\sqrt n)\) 的时间求出。
总时间复杂度 \(O(\sqrt r)\)
例4 牛客网NC13221数码
显然数论分块
然后统计一下每一块内1到9出现的情况乘上 \(n/l\) 即可
例5 P2260 [清华集训2012]模积和
设 \(n\leq m\)
前面那两坨就是个数论分块板子,后面那块拆一下:
这里还是可以数论分块,每次块的 \(r\) 可以取 \(\min(\dfrac m l, \dfrac n l)\)
然后还有几个难点
-
后面那坨鬼东西乘 \(i^2\),众所周知二次方和公式 \(\sum_{i=1}^n i^2=\dfrac {n(n+1)(2n+1)}6\)
-
然后上面那个鬼公式因为上面三个乘起来会爆所以要用逆元
-
然后因为
↑↓出题人模数不是质数不能用费马只能老老实实打拓欧
本文来自博客园,作者:zhangtingxi,转载请注明原文链接:https://www.cnblogs.com/zhangtingxi/p/16531978.html