二阶常系数齐次线性递推
题意
给定一个序列的线性递推式:
fn=⎩⎪⎨⎪⎧a⋅fn−1+b⋅fn−2f1f0,,,n≥2n=1n=0
多组询问,给定 n,a,b,f0,f1,求 fn 的值。
解法
毒瘤出题人的做法就是一个矩阵光速幂。
这里考虑一个通项公式\生成函数的做法:
由 fn=a⋅fn−1+b⋅fn−2 移项得到:fn−a⋅fn−1−b⋅fn−2=0。
令 g(x)=∑k=0∞fk⋅xk 的生成函数,那么易知:
g(x)=f0+f1⋅x1+f2⋅x2+f3⋅x3⋯a⋅x⋅g(x)=a⋅f0⋅x1+a⋅f1⋅x2+a⋅f2⋅x3+⋯b⋅x2⋅g(x)=b⋅f0⋅x2+b⋅f1⋅x3+b⋅f2⋅x4+⋯
按照套路推导,三式相加减易知:
(1−a⋅x−b⋅x2)⋅g(x)=f0+(f1−a⋅f0)⋅x+(f2−a⋅f1−b⋅f0)⋅x2+⋯
观察易知对于 x2 及其以后的项的系数都满足 fn−a⋅fn−1−b⋅fn−2=0,那么原式可化为:
(1−a⋅x−b⋅x2)⋅g(x)=f0+(f1−a⋅f0)⋅xg(x)=1−a⋅x−b⋅x2f0+(f1−a⋅f0)⋅x
考虑把 g(x) 化简成 g(x)=1−A⋅xc1+1−B⋅xc2 的形式,大量的计算后得到:
A=2a+a2+4⋅b,B=2a−a2+4⋅bg(x)=1−2a+a2+4⋅b⋅xc1+1−2a−a2+4⋅b⋅xc2
将部分分式和的形式的 g(x) 代入 (1−a⋅x−b⋅x2)⋅g(x)=f0+(f1−a⋅f0)⋅x 中:
(1−2a−a2+4⋅b⋅x)⋅c1+(1−2a+a2+4⋅b⋅x)⋅c2=f0+(f1−a⋅f0)⋅x(c1+c2)+(−2a−a2+4⋅b⋅c1−2a+a2+4⋅b⋅c2)⋅x=f0+(f1−a⋅f0)⋅x
那么又到了喜闻乐见的暴算解二元一次方程组的时候了:
{c1+c2=0−2a−a2+4⋅b⋅c1−2a+a2+4⋅b⋅c2=f1−a⋅f0
{c1=−2a2+4⋅ba−a2+4⋅b⋅f0+a2+4⋅b1⋅f1c2=2a2+4⋅ba+a2+4⋅b⋅f0−a2+4⋅b1⋅f1
这里考虑一个生成函数的封闭形式 1−k⋅x1,展开后得到:
g(x)=1+k⋅x+k2⋅x2+⋯g(x)=i=0∑∞ki⋅xi
那么该生成函数的第 n 项的系数为 kn,所以 fn=c1⋅An+c2⋅Bn,代入 c1,c2,A,B 后得到:
fn=(−2a2+4⋅ba−a2+4⋅b⋅f0+a2+4⋅b1⋅f1)⋅(2a+a2+4⋅b)n+(2a2+4⋅ba+a2+4⋅b⋅f0−a2+4⋅b1⋅f1)⋅(2a−a2+4⋅b)n
例子
著名的斐波那契数列 fn=fn−1+fn−2,此时 a=1,b=1,f0=0,f1=1,代入通项公式得到:
fn=51(21+5)n−51(21−5)n
实现
考虑模数为奇质数下的二次剩余和光速幂。如果不存在二次剩余怎么办?
这个对任意模数下求二次剩余的东西我完全不会~~(好像跟扩域有关?)~~,请教教我。