问题引入
因为一些原因,变量名与题面中的变量名有不同,题解中以这里声明的变量名为准
给出一多项式F(x)=∑i=0kfixiF(x)=i=0∑kfixi和递推式ap=∑i=1nbiap−i+F(p)(p≥n)ap=i=1∑nbiap−i+F(p)(p≥n)和初始值a0,a1,...,an−1a0,a1,...,an−1,求bmbm的值。n,k≤30000,m<109n,k≤30000,m<109。
前置芝士
算法流程
类似于齐次线性递推,我们先考虑矩阵快速幂的暴力:
设
A=(an−1an−2...a0nknk−1...n0)A=(an−1an−2...a0nknk−1...n0)
B=(B1n×n0n×(k+1)B2(k+1)×nB3(k+1)×(k+1))B=(B1n×nB2(k+1)×n0n×(k+1)B3(k+1)×(k+1))
其中
B1n×n=(b1100...0b2010...0b3001...0⋮⋮⋮⋮⋱⋮bn000...0)B1n×n=⎝⎜⎜⎜⎜⎜⎜⎛b1b2b3⋮bn100⋮0010⋮0001⋮0.........⋱...000⋮0⎠⎟⎟⎟⎟⎟⎟⎞
B2(k+1)×n=(fk00...0fk−100...0⋮⋮⋮⋱⋮f000...0)B2(k+1)×n=⎝⎜⎜⎜⎜⎛fkfk−1⋮f000⋮000⋮0......⋱...00⋮0⎠⎟⎟⎟⎟⎞
B3(k+1)×(k+1)=((kk)00...0(kk−1)(k−1k−1)0...0(kk−2)(k−1k−2)(k−2k−2)...0⋮⋮⋮⋱⋮(k0)(k−10)(k−20)...(00))B3(k+1)×(k+1)=⎝⎜⎜⎜⎜⎜⎜⎜⎛(kk)(k−1k)(k−2k)⋮(0k)0(k−1k−1)(k−2k−1)⋮(0k−1)00(k−2k−2)⋮(0k−2).........⋱...000⋮(00)⎠⎟⎟⎟⎟⎟⎟⎟⎞
B1B1矩阵就是齐次线性递推中的矩阵,B2B2将F(n)F(n)加入进当前的数,而B3B3通过二项式定理将(nknk−1...n0)(nknk−1...n0)变为((n+1)k(n+1)k−1...(n+1)0)((n+1)k(n+1)k−1...(n+1)0)。
那么答案就是(ABm)n(ABm)n。
我们如果可以得到BB的特征多项式f(λ)=∣λI−B∣f(λ)=∣λI−B∣就是齐次线性递推那一套了。
注意到λI−B=(λI−B10−B2λI−B3)λI−B=(λI−B1−B20λI−B3),利用矩阵分块的经典结论,∣λI−B∣=∣λI−B1∣∣λI−B3∣∣λI−B∣=∣λI−B1∣∣λI−B3∣。
在齐次线性递推中我们已经知道了∣λI−B1∣=λn−∑j=1nbiλn−i∣λI−B1∣=λn−j=1∑nbiλn−i,而λI−B3λI−B3是一个下三角矩阵,故∣λI−B3∣=(λ−1)k+1∣λI−B3∣=(λ−1)k+1,那么∣λI−B∣=(λ−1)k+1(λn−∑j=1nbiλn−i)∣λI−B∣=(λ−1)k+1(λn−j=1∑nbiλn−i)。卷一下就可以得到其表示。
可以发现其特征多项式是n+k+1n+k+1次的,所以我们还需要求出an,an+1,...,an+kan,an+1,...,an+k才行。
定义b0=0b0=0,递推式可以被表示为A(x)=A(x)∗B(x)+P(x)A(x)=A(x)∗B(x)+P(x)的形式,其中A(x)=∑i=0∞aixi,B(x)=∑i=0nbixiA(x)=i=0∑∞aixi,B(x)=i=0∑nbixi,而P(x)P(x)则相对复杂:在i≥ni≥n时遵循递推式,那么[xi]P(x)=F(i)[xi]P(x)=F(i);在i<ni<n时需要用P(x)P(x)把系数补上,那么[xi]P(x)=ai−∑j=0iajbi−j[xi]P(x)=ai−j=0∑iajbi−j。
那么A(x)=P(x)1−B(x)A(x)=1−B(x)P(x),求逆卷一下然后多点求值就可以得到A(x)A(x)的前n+kn+k项。
注 :在落谷上不要抄呦