笔记:类欧几里得
类欧几里得算法笔记
形式
类欧几里得可以在 \(O((p+q)^4\log M)\) 的复杂度内解决形如:
的问题 (\(n,M,A,B>0\)),由于其转化过程和复杂度证明和欧几里得法(辗转相除)相似,称作类欧几里得(国外喜欢称作 floor sum)。
简易形式
简易形式 \(q=0,p=1\) 令:
一些小性质
对于任意正实数 \(N\) :
注意,推导式子时一定要使用充要条件,例如 \(x<\lfloor N\rfloor\) 不能直接写成 \(x<N\) ,这是个必要不充分条件,会导致解集扩大。
正确做法是写成 \(x+1 \leq \lfloor N\rfloor\) 这时可以写作 \(x+1 \leq N\)
解法
对 \(A,B\) 做除法分解:
打开就能得到:
现在 \(A,B\) 都归约到了小于 \(M\) 的值。
现在要求:
这里 \(j\) 从 \(0\) 枚举保证下界相同,交换求和次序得到:
观察式子,我们理应能推出形如 \(i>\lfloor x\rfloor\) 的形式,现在求 \(x\) (注意需要使用充要条件)。
这样子式子变为:
这里 \(K=\lfloor\frac{AN+B}{M}\rfloor-1\) ,我们发现 \(M\) 和 \(A\) 替换位置了,最开始我们已经归约到了 \(A<M\) 的情况,交换位置后可以继续执行除法分解。
这个过程本质是辗转相除的过程 (\(\gcd(A,B)=\gcd(B,A\bmod B)\)),并且换元操作是 \(O(1)\) 的,复杂度即为 \(O(\log M)\) 。
一般情况的问题可以用相同的做法推出。
万能类欧几里得
转到图像上,上式等价于一条直线下方的整点个数。

上述推式子的操作就等价于将截距取模,将斜率取模,换元操作表示将直线沿 \(y=x\) 翻转。
对于一条竖线,从 \(y=0\) 往上扫描,每碰到一条竖线,乘一个 \(R\),每碰到一条横线,乘一个 \(U\) ,当落到整点上时先乘 \(U\) 再乘 \(R\) 。
根据矩阵递推的知识,可以创建向量 \([cnt,\sum,1]\) 表示当前线下方有多少个点,目前统计了多少个点,\(U,R\) 写成矩乘,那么我们只要求出最后整个串的矩乘就能求出答案。
上图的乘积序列就是 \([URUUURUURUUR]\) 。
那我们定义 \(f(N,A,B,M,U,R)\) 来表示这个过程。
若 \(B \geq M\) ,则序列开头是 \(\lfloor\frac{B}{M}\rfloor\) 个 \(U\),提出来变为 \(U^{\lfloor\frac{B}{M}\rfloor}f(N,A,B\bmod M,M,U,R)\) 。
若 \(A \geq M\) ,可以缩短斜率,每个 \(R\) 前会额外附加 \(\lfloor\frac{A}{M}\rfloor\) 个 \(U\) ,变为 \(f(N,A\bmod M,B,M,U,U^{\lfloor\frac{A}{M}\rfloor}R)\) 。
当 \(A,B < M\) 时,需要交换坐标系,由 \(y \leq \lfloor\frac{Ax+B}{M}\rfloor\) 得到 \(x \geq \lfloor\frac{My-B-1}{A}\rfloor+1\) 。也就是说:第 \(x\) 个 \(R\) 前面有 \(\lfloor\frac{Ax+B}{M}\rfloor\) 个 \(U\) ,则第 \(x\) 个 \(U\) 前面有 \(\lfloor\frac{My-B-1}{A}\rfloor\) 个 \(R\) 。
这时相邻两个 \(U\) 之间 \(R\) 的个数是 \(\lfloor\frac{My-B-1}{A}\rfloor-\lfloor\frac{M(y-1)-B-1}{A}\rfloor\) ,发现 \(y=1\) 时后面式子为负数,单独拿出来做,后面的式子直接取 \(0\) ,此时从 \(x=2\) 开始是标准形式,做 \(g(x)=f(x+1)=\lfloor\frac{Mx+M-B-1}{A}\rfloor\),上界由于平移变成 \(K-1\) , \(K=\lfloor\frac{AN+B}{M}\rfloor\) 。
此时还有个问题,如下图:

以 \(x=4\) 为界限,原始线的序列为 \(URRRUR\),此时 \(K=2\) ,在新线上,只计算到 \(K-1=1\) 时的序列为 \(RRRU\) (注意此时 \(UR\) 交换),加上 \(x=1\) 补上的一个 \(U\),最后缺了一个 \(R\),因为此时让新线内 \(y=4\) 的 \(x\) 是实数,经过下取整就会取不到。
总共需要 \(N\) 个 \(R\) ,最后还需要 \(N-\lfloor\frac{MK-B-1}{A}\rfloor\) 个 \(R\) 补充。
当 \(K=0\) 时,整条直线全是 \(R\) ,直接返回,当 \(A=0\) 时,这时不做交换,式子为 \(\lfloor\frac{B}{M}\rfloor=0\),返回单位阵即可。
复杂度是 \(O(\log \max(A,M))\) ,快速幂相互之间可以抵消,不会证明啊。
例题
求 \(\sum y,\sum xy,\sum y^2\)
像线段树一样,万能欧几里得只需要合并两端点信息就行。
单独求 \(\sum y\) 的,比较常用,\(sum\) 是所有的和,\(cnt\) 是但前的值:
再维护 \(cntx,cnty\) 即可。注意这里的 \(L,R\) 是对于 \(x\) 而言的。
求 \(\sum x^py^q\)
就是求一般形式的类欧了,考虑合并两端信息:
需要维护 \(cntx,cnty,\sum x^{k_1}y^{k_2}\) 的值,而合并一个 \(\sum x^{k_1}y^{k_2}\) 需要 \(O(k_1k_2)\) ,单次合并总复杂度是 \(O(p^2q^2)\),比\(O((p+q)^5)\) 快。
给定矩阵求 \(\sum A^xB^y\) 。
合并很简单,就不推式子了。
参考资料
https://www.luogu.com.cn/article/0nty0w8p
https://qiita.com/sounansya/items/51b39e0d7bf5cc194081

浙公网安备 33010602011771号