无摘要
求一个满足 $k$ 阶齐次线性递推数列 $\{f_{i}\}$ 的第 $n$ 项,即:
$$
f_n=\sum\limits_{i=1}^k a_i \times f_{n-i}
$$
我们知道线性递推是能表示为有理生成函数的,即 $F(x)=\dfrac{P(x)}{Q(x)}$ 的形式。具体操作可以考虑给 $F(x)$ 乘上 $A(x)$ 观察其系数变化,这里不再赘述。
现在所求即为 $[x^n]\dfrac{P(x)}{Q(x)}$,$\dfrac{P(x)}{Q(x)}=\dfrac{P(x)Q(-x)}{Q(x)Q(-x)}$。注意到 $Q(x)Q(-x)$ 是一个偶函数,因此其只有偶数次位置有值,可以表示为 $\lambda(x^2)$。然后将 $P(x)Q(-x) \bmod x^k$ 写成 $\alpha(x^2)+x\beta(x^2)$,这里分别对应偶数次位置和奇数次位置,所以就可以将 $n$ 分成两半递归了。
这便是 Bostan-Mori 算法。
1 | int bostan_mori(vi p, vi q, int n, int K) { |