有一排$n(n\le 10^9)$ 个球,定义一个组可以只包含一个球或者包含两个相邻的球.现在一个球只能分到一个组中,求从这些球中取出 $k(k<2^{15})$组的方案数.
设$dp[i][j]$,为把前$i$个球分成$j$组的方案数。
显然
把$dp[i]$看出一个多项式,即$dp[i]=(x+1)dp[i-1]+xdp[i-2]$
倍增FFT
递推式已经得出来。考虑倍增式。
显然
- 两堆不影响$dp[i+j][k]=\sum_{a+b=k}dp[i][b]*dp[j][a]$
- 两堆中有$1+1$,$dp[i+j][k+1]=\sum_{a+b=k}dp[i-1][b]*dp[j-1][a]$
维护三个$(dp[x-2],dp[x-1],dp[x])\rightarrow(dp[x-1+x-1],dp[x-1+x],dp[x+x])$
类似快速幂的方法(遇到$1$往末尾$+1$,即递推,都有$<<1$)
特征方程
显然把$x$看成一阶特征方程的递推式,即
- 注意由于常数项为$0$,可以进行开根,快速幂(简单版)
代码
1 |
|