来自2016集训队作业。
CC毒瘤题真是多。。。
求 ∑i+j+k=nijkfifjfkmodm ,其中 fi 是斐波那契数列。 n≤1018,m≤105 。
答案的生成函数是
(zDz1−z−z2)3
,展开后可知答案是
[zn](z+1/z)3F(z)6
,其中
F(z)=z1−z−z2
,是
fi
的生成函数。
我们考虑怎么展开
[zn]F(z)6
得到其关于
fn
的表达式。
设
ϕ,ϕ^
分别为
z2−z−1=0
大于0和小于0的两个根。
我们知道
F(z)=15√(11−ϕz−11−ϕ^z)
,先来试试算个
F(z)2
。
5F(z)2 =(11−ϕz)2−2F(z)/z+(11−ϕ^z)2=∑n(n+11)(ϕn+ϕ^n)zn−2F(z)/z
注意到
ϕn+ϕ^n =[zn](11−ϕz+11−ϕ^z)=[zn]2−(ϕ+ϕ^)z(1−ϕz)(1−ϕ^z)=[zn](2F(z)/z−F(z))=2fn+1−fn
因此 [zn]F(z)2=(2nfn+1−(n+1)fn)/5 。我们可以用类似的方法算出 ∑kkfkfn−k , 然后我们算 F(z)6 的时候可以先将其二项式展开然后合并成两部分的和,会得到一系列的各种形式的 F(z)3 ,接着再用 F(z)2 和 ∑kkfkfn−k 凑出来。。。
于是我们最后得到的大概会是 [zn]F(z)6=∑6k=0Cn,kfn+k 的形式,其中 Cn,k 里可能有关于 (n+O(k)O(k)) 的组合数之类。因为下指标很小所以组合数可以暴力算,剩下的 fn 直接矩乘算。
要注意会有一个 56 的分母,我们把 m <script type="math/tex" id="MathJax-Element-81">m</script>乘上它之后再做,最后再除掉他就好。
用有理生成函数的一般展开定理也可以用来解这个系数,但是得到展开里的多项式也要一点技巧(虽然可以暴力),我打算以后用这个技巧