CodeChef AUG14 SIGFIB

来源:互联网 发布:记事本如何编译java 编辑:程序博客网 时间:2024/06/07 01:32

  来自2016集训队作业。
  CC毒瘤题真是多。。。


  求i+j+k=nijkfifjfkmodm,其中fi是斐波那契数列。n1018,m105


  答案的生成函数是(zDz1zz2)3,展开后可知答案是[zn](z+1/z)3F(z)6,其中F(z)=z1zz2,是fi的生成函数。
  我们考虑怎么展开[zn]F(z)6得到其关于fn的表达式。
  设ϕ,ϕ^分别为z2z1=0大于0和小于0的两个根。
  我们知道F(z)=15(11ϕz11ϕ^z),先来试试算个F(z)2
  

  5F(z)2    =(11ϕz)22F(z)/z+(11ϕ^z)2=n(n+11)(ϕn+ϕ^n)zn2F(z)/z

  注意到
  
  ϕn+ϕ^n      =[zn](11ϕz+11ϕ^z)=[zn]2(ϕ+ϕ^)z(1ϕz)(1ϕ^z)=[zn](2F(z)/zF(z))=2fn+1fn  

  因此[zn]F(z)2=(2nfn+1(n+1)fn)/5。我们可以用类似的方法算出kkfkfnk, 然后我们算F(z)6的时候可以先将其二项式展开然后合并成两部分的和,会得到一系列的各种形式的F(z)3,接着再用F(z)2kkfkfnk凑出来。。。
  于是我们最后得到的大概会是[zn]F(z)6=6k=0Cn,kfn+k的形式,其中Cn,k里可能有关于(n+O(k)O(k))的组合数之类。因为下指标很小所以组合数可以暴力算,剩下的fn直接矩乘算。
  要注意会有一个56的分母,我们把m乘上它之后再做,最后再除掉他就好。
  (以上都是未经实践的口胡)
  其实一开始大力MMA就可以得到系数了
  用有理生成函数的一般展开定理也可以用来解这个系数,但是得到展开里的多项式也要一点技巧(虽然可以暴力),我打算以后用这个技巧出题干点奇怪的事所以就不写在这里了。

原创粉丝点击