[学习笔记]类欧几里得

类欧几里得旨在处理一类问题:
即和直线下整数点有关问题。
\(f(a,b,c,n) = \sum_{i = 0}^n\lfloor\frac{ai + b}{c}\rfloor\)

我们先考虑\(a > c,b > c\)我们先对其进行取膜

\(f(a,b,c,n) \\= \sum_{i = 0}^n\lfloor\frac{ai + b}{c}\rfloor\\=\sum\lfloor\frac{(\lfloor{\frac{a}{c}}\rfloor * c + a\ mod\ c) \times i + (\lfloor{\frac{b}{c}}\rfloor * c + b\ mod\ c)}{c}\rfloor\\=\frac{n(n + 1)}{2}\lfloor\frac{a}{c}\rfloor + (n + 1)\lfloor\frac{b}{c}\rfloor + f(a\ mod\ c,b\ mod\ c,c,n)\)

考虑转化贡献:

\(= \sum_{j = 0}^{\lfloor\frac{an + b}{c}\rfloor - 1}\sum_{i = 0}^n [j < \lfloor\frac{ai + b}{c}\rfloor]\)

接下来是最关键的一步,我们转换条件
\(\lfloor\frac{ai + b}{c}\rfloor \to j + 1\leq \frac{ai + b}{c}\)

在做变换有
\(\lfloor\frac{ai + b}{c}\rfloor \to j + 1\leq \frac{ai + b}{c}\to jc + c \leq ai + b \to jc + c - b - 1 < ai\)

所以有\(\lfloor\frac{jc + c - b - 1} {a}\rfloor < i\)
\(m = \lfloor\frac{an + b}{c}\rfloor\)
所以改柿子为\(f(a,b,c,n) = \sum_{j = 0}^{m - 1}\sum_{i = 0}^n[i > \lfloor\frac{jc + c - b - 1} {a}\rfloor]\)

所以有\(= \sum_{j = 0}^{m - 1}(n - \lfloor\frac{jc + c - b - 1}{a}\rfloor) = nm - f(c,c - b - 1,a,m - 1)\)

于是我们发现其变成了一个辗转相乘的的形式,有类似于欧几里得。其为\(O(logn)\)

我们还可以思考下列两个变种式,但是由于我太懒了,不太想打\(LaTex\),我找时间把我手写的拍上来。

\(g(a,b,c,n) = \sum_{i = 0}^n i \lfloor\frac{ai + b}{c}\rfloor\)

\(h(a,b,c,n) = \sum_{i = 0}^n ( \lfloor\frac{ai + b}{c}\rfloor) ^ 2\)

因为万欧比较好写,所以可能不会实现该类欧做法,下次遇到万欧不能做的再放题上来吧。

posted @ 2021-12-22 13:08  fhq_treap  阅读(114)  评论(0编辑  收藏  举报