LOJ3219 「PA 2019」Iloczyny Fibonacciego

考虑斐波那契数的性质。

\[F_{n+m}=F_{n}\cdot F_{m}+F_{n-1}\cdot F_{m-1}\\ F_{n}\cdot F_{m}=F_{n+m}-F_{n-1}\cdot F_{m-1}\\ =F_{n+m}-F_{n+m-2}+F_{n+m-4}-\cdots\\ =\sum_{i=0}^{i\le n\and i\le m}(-1)^iF_{n+m-2i}\\ \]

考虑一对斐波那契数 \(f_n\cdot f_m\) 的贡献开始于 \(n+m\) 结束于 \(|n-m|\) ,我们考虑用类似于前缀和的操作做一个差即可。考虑定位所有前者的位置就是一个普通的卷积,而定位后者的位置我们则可以利用差的卷积加一个反转即可,发现是 \(A(-x)\cdot B(\frac{1}{x}) x^m\) 。我们不妨来考虑证明一下。

  • \(i\bmod 2=1,(-x^i)\cdot x^{m-j}=-x^{m+i-j}\)
  • \(i\bmod 2=0,x^i\cdot x^{m-j}=x^{m+i-j}\)

考虑当 \(i>j\) 的时候,应该依据 \(j\) 的奇偶决定容斥系数,此时对于答案位为奇数的位置需要取反一下。考虑当 \(i<j\) 的时候,依据的是 \(i\) 的奇偶性决定容斥系数,所以不会存在问题。同时我们再将两个多项式进行平移微调。此时,我们只需要将这两个多项式进行相减就可以得到一个合法的斐波那契表示,但并非最简的那个。

我们考虑将两者分别转化成最简形式再相减。如何转化成最简形式呢?我们可以想到,通常的斐波那契表示可以看成是若干个最简的斐波那契表示的和,我们直接多位同时进行类似于龟速乘的东西即可。现在的问题便为如何快速计算两个最简斐波那契表示的加减法。

考虑先直接按位相加,然后直接从高位到低位处理大于 \(1\) 的位置,然后再从高位到低位处理连续的 \(1\) 。考虑减法的话,再加一个步骤将整个序列变成由 \(0,1,2\) 组成的再考虑前面的步骤,也是从高到低处理,碰到 \(00x\) 的选择拆 \(x\) 到下两位,不然就考虑用高位抵消掉 \(-1\) 即可。

咦,我发现我是带模数的,所以减法可以直接变成加法。

感觉有一些边界的情况还需要判定,但是我咕咕咕。

posted @ 2022-01-27 16:05  Point_King  阅读(138)  评论(0编辑  收藏  举报