整除分块/数论分块白学
前言
- 哦哦哦哦哦哦哦哦哦!李超树太难学了多项式太构思了所以来学整除分块了哦哦哦哦哦哦!
- 哦哦哦哦哦哦!怎么还有 BSGS
- woc我之前用的 \(\lfloor\rfloor\) 写得好丑啊啊啊啊啊
整除分块
- 这个东西通常解决一类问题:
\[\sum_{i=1}^nf(i)g\left(\left\lfloor\dfrac ni\right\rfloor\right)
\]
普通整除分块
- 我们尝试解决一下上面的问题
- 我们令 \(d = \left\lfloor\dfrac ni\right\rfloor\),会发现 \(\forall i\),有且仅有一个 \(d\) 与之对应,但是 \(\exists d\) 与多个 \(i\) 对应
- 所以我们就发现存在区间 \([l,r]\),\(i \in [l,r]\) 的所有 \(\left\lfloor\dfrac ni\right\rfloor\) 都为 \(d\),我们就可以把这些分成一块,直接处理块就行,可以证明块数不会超过 \(2\sqrt n\) 个,左右端点分别为:
\[\left\lfloor\dfrac{n}{d+1}\right\rfloor + 1\le i \le \left\lfloor\dfrac{n}{d}\right\rfloor
\]
- 代码,e,直接搜吧msjing咕咕咕
高级的整除分块!
向上取整
\[\sum_{i=1}^nf(i)g\left(\left\lceil\dfrac ni\right\rceil\right)
\]
- e,这个东西就是转化一下,用一个定理:
\[\left\lceil\dfrac nm\right\rceil = \left\lfloor\dfrac {n-1}{m}\right\rfloor + 1
\]
- 浅证一下
证明
- 当 \(\gcd(n,m) = 1\) 时,显然(?),可以直接代俩数进去算一下
- 反之,\(n-1\) 后,由于下取整性质,会少一个,所以加回来,\(n-1\) 对上面的情况没影响
- 转化一下上取整,就有:
\[f(n)g(1) + \sum_{i=1}^{n-1}f(i)g\left(\left\lfloor\dfrac {n-1}i\right\rfloor + 1\right)
\]
- 注意需要提出 \(f(n)\) 和 \(g(1)\) 以及改变 \(\sum\) 上界,因为要符合下取整的柿子
高阶整除分块
\[\sum_{i=1}^{n}f(i)g\left(\left\lfloor\dfrac {n_1}i\right\rfloor,\left\lfloor\dfrac {n_2}i\right\rfloor,\dots,\left\lfloor\dfrac {n_m}i\right\rfloor\right)
\]
- 其实我们大多数就见过二维的,长这样:
\[\sum\limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac ni\right\rfloor\left\lfloor\dfrac mi\right\rfloor
\]
- 和普通分块有一点区别
就是把左端点改成求 \(\min\),长度改为前缀
—— pb
- 差不多长这样
点击查看代码
int get(int x,int y)
{
int res=0;
for (int i=1,j=0;i<=x;i=j+1)
j=min(x/(x/i),y/(y/i)),res+=(x/i)*(y/i)*(s[j]-s[i-1]);
return res;
}
代码是写题剩的- 这个在莫反里超级常用
后话
- 没了喵
- msjing要去学大步小步了哦哦哦哦哦哦哦哦哦!

浙公网安备 33010602011771号