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

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

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)
  代码太丑就不贴了。
发布了135 篇原创文章 · 获赞 6 · 访问量 13万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章