类欧几里得算法学习笔记

用途

  这个算法可以使用递归快速计算 \(f(a, b, c, n) = \sum_{i = 0}^n \left\lfloor \frac{ai +b}{c}\right\rfloor,g(a, b, c, n) = \sum_{i = 0}^n \left\lfloor \frac{ai +b}{c}\right\rfloor^2,h(a, b, c, n) = \sum_{i = 0}^n i\left\lfloor \frac{ai +b}{c}\right\rfloor\)

思想

  和 \(\gcd\)求解过程很像,每次分情况讨论:

  1. \(a = 0\),可以直接计算。
  2. \(a \ge c \vee b \ge c\),尝试将问题转化为 \((a \bmod ~ c, b \bmod ~ c)\)
  3. \(a < c \wedge b < c\),尝试将问题转化为 \((c, ***, a, ***)\)

  其中,第 \(2\) 点可以尝试直接将 \(a, b\) 拆成除以 \(c\) 的商和余数,然后一顿拆式子解决。

  对于第 \(3\) 点,通常可以枚举 \(i\),然后再枚举一个值 \(1 \le x \le \left\lfloor \frac{ai+b}{c}\right\rfloor\)(假设我们求的是 \(f\),对于 \(g, h\) 同理),接着交换求和顺序,将对于 \(x\)的限制转化成对于 \(i\)的限制:

\[x \le \left\lfloor \frac{ai+b}{c}\right \rfloor \Rightarrow cx \le ai + b \Rightarrow cx < ai + b + 1 \Rightarrow i > \left\lfloor\frac{cx - b - 1}{a}\right \rfloor \]

  注意之后可能会为了方便递归使得 \(x\) 的枚举范围从 \(0\) 开始,于是可能见到的式子是 \(i > \left\lfloor\frac{cx + c - b - 1}{a}\right \rfloor\)

具体推导

  下文我们记 \(S_k(t)\) 表示 \(\sum_{i = 0}^t i^k\),同时令 \(M = \left\lfloor\frac{an + b}{c}\right\rfloor\)

  多推式子有利于巩固知识,于是我推了两遍,用了 5 张草稿纸。

f(a, b, c, n)

  1. \(a = 0\),答案是 \(S_0(n)\left\lfloor\frac{b}{c}\right\rfloor\)

  2. \(a \ge c \vee b \ge c\),那么有:

    \[\begin{aligned} f(a, b, c, n) &= \sum_{i = 0}^n \left\lfloor\frac{(a \bmod c) i + \left\lfloor\frac{a}{c}\right\rfloor c i + (b \bmod c) + \left\lfloor \frac{b}{c}\right\rfloor c }{c}\right\rfloor\\ &= \sum_{i = 0}^n \left\lfloor\frac{a}{c}\right\rfloor i + \left\lfloor \frac{b}{c}\right\rfloor + \left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor\\ &= \left\lfloor\frac{a}{c}\right\rfloor S_1(n) + \left\lfloor \frac{b}{c}\right\rfloor S_0(n) + f(a \bmod c, b \bmod c, c, n) \end{aligned} \]

  3. \(a < c \wedge b < c\),那么有:

    \[\begin{aligned} f(a, b, c, n) &= \sum_{i = 0}^{n} \sum_{x = 0}^{M - 1}\left[i > \left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor\right]\\ &= \sum_{x = 0}^{M - 1} n - \left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor\\ &= nM - f(c, c - b - 1, a, M - 1) \end{aligned} \]

g(a, b, c, n)

  1. \(a = 0\),答案就是 \(S_0(n)\left\lfloor\frac{b}{c}\right\rfloor^2\)

  2. \(a \ge c \vee b \ge c\),有:

    \[\begin{aligned} g(a, b, c, n) &= \sum_{i = 0}^n \left\lfloor\frac{(a \bmod c) i + \left\lfloor\frac{a}{c}\right\rfloor c i + (b \bmod c) + \left\lfloor \frac{b}{c}\right\rfloor c }{c}\right\rfloor^2\\ &= \sum_{i = 0}^n \left( \left\lfloor\frac{a}{c}\right\rfloor i+ \left\lfloor \frac{b}{c}\right\rfloor+ \left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor \right)^2\\ &= \sum_{i = 0}^n \left( \left\lfloor\frac{a}{c}\right\rfloor i+ \left\lfloor \frac{b}{c}\right\rfloor\right)^2 + 2\left( \left\lfloor\frac{a}{c}\right\rfloor i+ \left\lfloor \frac{b}{c}\right\rfloor\right) \left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor +\left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor ^2\\ &= \sum_{i = 0}^n \left\lfloor\frac{a}{c}\right\rfloor ^2 i ^ 2 + \left\lfloor \frac{b}{c}\right\rfloor ^ 2 + 2\left\lfloor\frac{a}{c}\right\rfloor \left\lfloor \frac{b}{c}\right\rfloor i + 2\left\lfloor\frac{a}{c}\right\rfloor \left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor i + 2\left\lfloor \frac{b}{c}\right\rfloor \left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor +\left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor ^2\\ &= \left\lfloor\frac{a}{c}\right\rfloor ^2 S_2(n) + \left\lfloor \frac{b}{c}\right\rfloor ^ 2 S_0(n) + 2\left\lfloor\frac{a}{c}\right\rfloor \left\lfloor \frac{b}{c}\right\rfloor S_1(n) + 2\left\lfloor\frac{a}{c}\right\rfloor h(a \bmod c, b \bmod c, c, n) + 2\left\lfloor \frac{b}{c}\right\rfloor f(a \bmod c, b \bmod c, c, n) + g(a \bmod c, b \bmod c, c, n)\\ \end{aligned} \]

  3. \(a < c \wedge b < c\),有:

    \[\begin{aligned} g(a, b, c, n) &= 2\sum_{i = 0}^n \sum_{x = 1}^M x\left[i > \left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor\right]- \sum_{i = 0}^{n} \left\lfloor\frac{ai + b}{c}\right\rfloor\\ &= -f(a, b, c, n) + 2 \sum_{x = 0}^{M - 1} (x+1)\sum_{i = 0}^n \left[i > \left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor\right]\\ &= -f(a, b, c, n) + 2\left(S_1(M)n - h(c, c - b - 1, a, M - 1) - f(c, c - b - 1, a, M - 1)\right) \end{aligned} \]

h(a, b, c, n)

  1. \(a = 0\),答案就是 \(S_1(n)\left\lfloor\frac{b}{c}\right\rfloor\)

  2. \(a \ge c \vee b \ge c\),有:

    \[\begin{aligned} h(a, b, c, n) &= \sum_{i = 0}^n i\left\lfloor\frac{(a \bmod c) i + \left\lfloor\frac{a}{c}\right\rfloor c i + (b \bmod c) + \left\lfloor \frac{b}{c}\right\rfloor c }{c}\right\rfloor\\ &= \sum_{i = 0}^n \left\lfloor\frac{a}{c}\right\rfloor i^2 + \left\lfloor \frac{b}{c}\right\rfloor i + \left\lfloor\frac{(a \bmod c) i + (b \bmod c) }{c}\right\rfloor i\\ &= \left\lfloor\frac{a}{c}\right\rfloor S_2(n) + \left\lfloor \frac{b}{c}\right\rfloor S_1(n) + h(a \bmod c, b \bmod c, c, n) \\ \end{aligned} \]

  3. \(a < c \wedge b < c\),有

    \[\begin{aligned} h(a, b, c, n) &= \sum_{i = 0}^{n} i\sum_{x = 0}^{M - 1}\left[i > \left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor\right]\\ &= \sum_{x = 0}^{M - 1} S_1(n) - S_1\left(\left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor\right)\\ &= \sum_{x = 0}^{M - 1} S_1(n) - \frac{\left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor \left(\left\lfloor \frac{cx + c - b - 1}{a}\right\rfloor + 1\right)}{2}\\ &= MS_1(n) - \frac{1}{2} g(c, c - b - 1, a, M - 1) - \frac{1}{2}f(c, c - b - 1, a, M - 1) \end{aligned} \]

  至于洛谷上的模板题,我们可以发现每次根据情况的转移都是到同一种函数,于是可以将 \(f, g, h\) 用结构体存下来一起计算,复杂度就是 \(\mathcal O(T\log V)\)

  代码

posted @ 2022-02-18 08:41  Werner_Yin  阅读(28)  评论(0编辑  收藏  举报