Cry_For_theMoon  

很久以前,和 MOer 同学分享矩阵快速幂 \(O(\log n)\) 求 fib 的第 \(n\) 项的时候,MOer 同学说 fib 用特征方程不是直接算出来了吗。

当然这个东西我当时也知道,但是这个式子不是有 \(\sqrt{5}\) 吗,如果 \(\bmod p\) 没有二次剩余那怎么算?

于是这个东西就不了了之了。

过了很久才发现原来确实是能直接算出来的。


对于生成函数形如 \(F(x) = \frac{G(x)}{H(x)}\) 的数列 \(f\)(这里不妨认为其是真分式),常见的技巧是将其部分分式展开。

当然,在实际题目中我们往往不是对一个任意的 \(F(x)\) 展开,因此暂时不用考虑那些一般化的方法,完全可以手动去展开。

实际情况中往往 \(H(x)\) 是二次式 \(ax^2 + bx + c\),假定其判别式非 \(0\)(为 \(0\) 的情况需要一些特殊考虑),则 \(cx^2 + bx + a = 0\) 的两根分别为 \(\alpha,\beta\),然后 \(F(x)\) 可以写成 \(\frac{v_1}{1-\alpha x} + \frac{v_2}{1-\beta x}\) 的形式。

分母之所以不写成 \(kx-1\) 而是 \(1-kx\) 的动机是后面把每个分式展开成无穷级数,进而得到 \([x^n]F(x)\)

然后 \(v_1\)\(v_2\) 代入 \(G(x)\),它的常数项和一次项系数各带来一个方程,因此可以解出 \(v_1,v_2\)

然后 \([x^n]F(x)\) 显然就是 \(v_1\alpha^n + v_2\beta^n\)

然后我们就可以 \(O(\log n)\) 计算 \(f(n)\)

问题在于,\(cx^2 + bx + a = 0\) 这个方程得到的根不一定是有理数,甚至不一定是实数。(当然,由于是 OI,模意义下判别式不会为负)。

这个时候我们就要引入拓域的思想,首先最开始我们所有的数都形如 \(p + q\sqrt{v}\) 的形式,其中 \(v\) 是固定数。

注意当 \(v\) 是模意义下的二次剩余的时候,我们不应该再扩域,可以将 \(v\) 设为 \(0\) 然后始终做整数运算。

原因是当 \(v\) 是模意义下的二次剩余的时候,一个数会出现多种表示,因此对于一个有理数 \(x\),模意义下 \(p + q\sqrt{v} = x\) 将不止有 \(p=x,q=0\) 这一组平凡解,这在我们很多判断的时候会出现问题;而当 \(v\) 不是二次剩余的时候,是不会出现上述的问题的。

现在可以发现,\((p,q)\) 关于加减乘法都是保持封闭的,我们再来解决求逆的事情。

首先 \((p,q)\) 不能求逆当且仅当 \(p+q\sqrt{v}=0\) 也就是 \((p,q)=(0,0)\)(对照上文,如果 \(v\) 是二次剩余,则这里的判断就变得比较麻烦)。

除法的话就是有理化一下变成 \(\frac{p-q\sqrt{v}}{p^2 - q^2v}\);特殊情况是如果 \(p^2 = q^2v\)\(|p| = |q\sqrt v|\),如果和为 \(0\) 那反正也 gg 了,因此,此时就一律认为逆是 \(\frac{1}{2p}\) 了。

这样的话加减乘 \(O(1)\),而除法是 \(O(\log mod)\) 的。

欸,我们本来四则运算不也这个复杂度吗,酷。

这样就可以 \(O(\log)\)\(f(n)\) 了。

那这和矩阵快速幂相比,有什么优越性吗?

好像在这个问题里真没有。GG


现在有这样一个问题:

\(\sum_{i=1}^{n} (fib_i)^k\),其中 \(k=10^5,n=10^9\)

那矩阵快速幂咋搞啊?好像暂时 GG 了。

用上面的东西就能做了:

\[\sum_{i=1}^{n}(v_1\alpha^i + v_2\beta^i)^k \\ =\sum_{i=1}^{n}\sum_{j=0}^{k}\dbinom{k}{j}(v_1\alpha^i)^j(v_2\beta^{i})^{k-j} \\ =\sum_{j=0}^{k}\dbinom{k}{j}v_1^jv_2^{k-j}\times \sum_{i=0}^{n}\alpha^{ij}\beta{i(k-j)} \]

后面其实等价于 \(\alpha^{j}\beta^{k-j}\) 为公差的等比数列求和。然后就 \(O(k\log n)\) 了。

你会发现,这里等比数列求和要判公比为 \(1\) 的情况,这就是上面说的 \(v\) 是二次剩余要特判,因为这种情况下 \(p+q\sqrt{v}=1\) 不太好判断。

但我如果不想写二次剩余怎么办?其实也不用真的做二次剩余。

假设 \(p+q\sqrt{v}\) 真的是 \(1\),由于我们知道了 \(p,q\) 所以可以 \(O(\log)\) 解出 \(a=\sqrt{v}\),如果 \(a^2 \neq v\),那么说明 \(p+q\sqrt{v}\) 就不会是 \(1\);否则的话我们没有写任何二次剩余的算法就解出了 \(x^2\equiv v\),然后就回到了整数的 case 直接做......

似乎矩阵做法出发其实也有相同的东西?但我不是很懂了。

posted on 2023-06-24 11:28  Cry_For_theMoon  阅读(132)  评论(1编辑  收藏  举报