挺有趣的一个组合数题。
发现这个
F 函数和
G 函数结合的形式十分丑陋,所以第一件事应该是把
F 和
G 拆开。
设
Fi,j 表示
Fi 第
j 项系数,有关系式
Fi,j′=(j+1)×Fi,j+1。
==========Fi,jGi−1,j+Gi−1,j′Gi−1,j+(j+1)×Gi−1,j+1Fi−2,j−Fi−2,j′+(j+1)×(Fi−2,j+1−Fi−2,j+1′)Fi−2,j−(j+1)×Fi−2,j+1+(j+1)×Fi−2,j+1−(j+1)×(j+2)×Fi−2,j+2Fi−2,j−(j+1)×(j+2)×Fi−2,j+2Gi,jFi−1,j−Fi−1,j′Fi−1,j−(j+1)×Fi−1,j+1Gi−2,j+Gi−2,j′−(j+1)×(Gi−2,j+1+Gi−2,j+1′)Gi−2,j+(j+1)×Gi−2,j+1−(j+1)×Gi−2,j+1−(j+1)×(j+2)×Gi−2,j+2Gi−2,j−(j+1)×(j+2)×Gi−2,j+2
可以发现
F 与
G 的递推式是相同的,所以可以用同一份代码计算
F 与
G。
直接照着这个使用矩阵加速能做到
O(m3logn) 的复杂度。
考虑正解,发现转移的第一维步长是偶数,所以如果
n 是奇数则可以先令
n←n−1 再特殊处理最后一步。接下来讨论
n 是偶数时的方案。我们将
F 数组的转移示意图画出来。
图中红色边的权值是
1,绿色边的权值是
−(j+1)(j+2)。
我们发现一个
f0,j 对
fn,j 的贡献可以被拆成两部分,一部分是绿色边的边权,另一部分是转移方案数。显然从一个
x 转移到
y 时,绿色边的边权是固定的,即
(−1)2x−yt=y+1∏xt,转移方案数是简单组合数,考虑从
x 走到
y 的时候走了几步绿边,方案数是
(2x−y⌊2n⌋)。
综上
Fn,i=j=1∑⌊2m−i⌋(−1)jt=i+1∏i+j×2t×(j⌊2n⌋)×F0,i+j×2,照着这个式子写能做到
O(m2) 的复杂度。