类欧几理得/万能欧几理得学习笔记
给定有关于 \(x\) 的函数 \(y_{|x}=\lfloor \frac{px+r}{q}\rfloor(p,r\ge 0, q>0)\)。它表达一条直线 \(L\) 下的整点。
万能欧几理得:
给定两个函数 \(f(x),g(y)\)。它们满足通过维护少量的值可以实现 \(f(x)\to f(x+1), g(y)\to g(y+1)\) 的线性递推。以 \(O(c\log n)\) 复杂度回答 \(\sum_{x=0}^nf(x)g(y)\)。其中 \(c\) 为单步递推的时间。
描述问题
考虑使用线性代数的形式表达求解过程。
沿 \(x\) 轴正方向扫描 \(L\),构造向量 \(V\) 表达当前的 \(f(x)g(y)\) 和前缀和 \(\sum_{i\le x}f(i)g(y_i)\) 以及一些其他的递推信息。
-
当 \(L\) 碰到 \(y\) 坐标为整数的水平直线,更新 \(g(y),..\)。
-
当 \(L\) 碰到 \(x\) 坐标为整数的竖直直线,更新 \(f(x),..\),并将现在的 \(f(x)g(y)\) 加入答案前缀里。
显然 1. 2. 都可以用矩阵表达出来,不妨依次记作矩阵 \(U,R\)。则我们只需要在 \(L\) 碰到水平线时令 \(V \leftarrow V\times U\),碰到竖直线时令 \(V \leftarrow V\times R\)。在扫描完 \(x=n\) 后 \(V\) 里的前缀和就是答案。
\(\color{red}{\Delta}\) 注意当 \(L\) 刚好穿过竖线和横线的交点,先统计横线贡献再计算答案。
加速维护
根据上文对问题的描述不妨称问题为
其中前四者为刻画求解范围的整数,后两者为刻画求解内容的矩阵。
\(p\ge q\)
这个式子表示可以将 \(x-1\to x\) 过程中 \(y\) 的增量看作 \(\lfloor \frac{p}{q}\rfloor\) 和 \(\lfloor \frac{(p \bmod q)x+r}{q}\rfloor-\lfloor \frac{(p \bmod q)(x-1)+r}{q}\rfloor\) 两部分。
第一部分贡献的统计并入 \(R\) 矩阵,第二部分可以表示为一条新直线。
可以得到:
\(p< q\)
考虑通过 更换扫描维度 将问题转化为上面一种情况。
扫描 \(y\) 轴,考虑给定 \(y\),解出满足 \(\lfloor \frac{px+r}{q}\rfloor < y\) 的 \(x\) 的范围:得到 \(x \le \lfloor \frac{qy-r-1}{p}\rfloor\)。
\(\color{red}{\Delta}\) 注意这里 \(\lfloor \frac{px+r}{q}\rfloor < y\) 不能取等的原因:\(L\) 经过交点先统计横直线贡献。
\(y\) 扫描到的最大值对应原函数 \(x=n\) 时 \(y\) 的值:\(m= \lfloor \frac{pn+r}{q}\rfloor\)。
形式和边界上的小问题:
-
当 \(m=0\),直接返回 \(R^n\)。
-
统计所有的 \(R\)。
我们需要补上 \(m\) 以后撞到的竖线,对应矩阵:\(R^{n-\lfloor \frac{qm-r-1}{p}\rfloor}\)
-
保证新的余数是正数。
考虑将第一个 \(U\) 和其之前的 \(R\) 拿出来单独计算,对应矩阵为 \(R^{\lfloor \frac{q-r-1}{p}\rfloor}U\),将直线上面的部分平移下来,得到直线 \(x=\lfloor \frac{q(x+1)-r-1}{p}\rfloor\)。
故可以得到:
参考 Blog:[学习笔记]万能欧几里得