TopCoder SRM 701 div1. 900 FibonacciStringSum - 矩阵乘法

来源:互联网 发布:app软件用什么编程 编辑:程序博客网 时间:2024/09/21 06:17

  初赛大原题!(雾
  稍微推一推就可以得到要算的式子是
  

k(n+1kk)kb(nk)a

  可以用二项式定理展开,得到
  
i(ai)ni(1)aik(n+1kk)kb+ai

  前面的求和指标是O(a)的,很小,所以现在想办法算后面的东西。
  注意到算k次方和的时候是可以矩乘的,这个玩意同理。
  设
Sd(n)=k(nkk)kd

  稍微把组合数拆一下然后变个型,尝试搞个递推式出来
  
Sd(n)=k0((n1kk)+(n1kk1))kd  =Sd(n1)+k+10(n2kk)(k+1)d  =Sd(n1)+k(n2kk)j(dj)kj  =Sd(n1)+j(dj)Sj(n2)

  于是Sd(n)这玩意就可以愉快地矩乘了。
  设
F1×2(d+1)(n)=[S0(n),S1(n)...Sd(n),S0(n+1),S1(n+1)...Sd(n+1)]

  那么F(n)F(n+1)的转移矩阵A是很容易得到的。
  我们原本要算的东西现在变成了
i(ai)ni(1)aiSb+ai(n+1)

  注意到实际上一次矩乘就可以把Sb...Sb+a给算出来,于是总复杂度为O(a3logn)
  代码太丑就不贴了。

0 0