才没有在做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)内就做完啦。
代码太丑就不贴了。