才没有在做cerc2015呢
看到好像不少人这题写fft卡得死死的啊,不如
O(n)
递推(雾)
首先可以观察出
(i,1)
这个格子为
x
时对
考虑
(i,j)
格子的
c
对
∑i=2n∑j=2n((n−i)+(n−j)n−i)an−ibn−jc
后面的 c 先不管,先把这个式子xjb变换一下。
其实推到这里就可以做了,注意到把组合数拆开了之后是两个指数生成函数的卷积的系数和(差不多这个意思),就可以直接上fft了。
继续把它推下去吧。
我们设
fn=∑i=0nai∑j=0n(i+ji)bj
那么答案就是 fn−2 ,现在考虑怎么搞出个递推式。我们可以把前 n−1 项都提出来。
fn=fn−1+an∑i=0n−1(n+ii)bi+bn∑i=0n−1(n+ii)ai+(2nn)anbn
注意到中间有两个东西是一样的,那么可以继续设
gn(x)=∑i=0n−1(n+ii)xi
把组合数拆了,继续推吧= =
gn(x)=∑i=0n−1((n−1+ii)+(n−1+ii−1))xi =gn−1(x)+(2n−2n−1)xn−1+∑i=0n−2(n+ii)xi+1=gn−1(x)+(2n−2n−1)xn−1+xgn(x)−(2n−1n−1)xn
移一下项,得到
gn(x)=(gn−1(x)+(2n−2n−1)xn−1−(2n−1n−1)xn)/(1−x)
把 gn(x) 代入 fn ,有
fn=fn−1+angn(b)+bngn(a)+(2nn)anbn
好的到这里 gn(x) 就可以 O(n) 算了。。。于是 fn 也可以 O(n) 算了。
注意一下 gn(0) 和 gn(1) 不用递推,直接算就好。
于是在 O(n) 内就做完啦。
代码太丑就不贴了。