整除分块/数论分块白学

前言

  • 哦哦哦哦哦哦哦哦哦!李超树太难学了多项式太构思了所以来学整除分块了哦哦哦哦哦哦!
  • 哦哦哦哦哦哦!怎么还有 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要去学大步小步了哦哦哦哦哦哦哦哦哦!
posted @ 2026-08-15 10:28  msjing  阅读(5)  评论(0)    收藏  举报