多项式卷积技巧(其中一个多项式系数是简单组合数)
多项式卷积技巧(其中一个多项式系数是简单组合数)
考虑下面的问题:
\[f_{i,j}={w_i\choose j}+\sum_{k< i} (\sum_{l\leq j} f_{k,l}{s_{k,i}\choose j-l})g_{k,i},(i\leq n,j\leq m)
\]
其中\(w,g,s\)为任意数字,求\(f\)。
暴力转移是\(O(N^2M^2)\)的。
用多项式乘法可以\(O(N^2M\log M)\)常数较大。
下面讨论一种\(O(N^2M)\)的小常数做法。
首先需要对组合数进行一步转换:\({m\choose n}=[x^n](1+x)^m\)。
则式子就可以写成:
\[f_i=h_{i}+\sum_{k<i}(f_k\times (1+x)^{s_{k,i}})g_{k,i}
\]
其中\(h_{i}=\sum_{j\geq 0} {w_i\choose j}x^j\)。
定义\(f'\)表示\(f\)左移\(1\)得到的多项式。
则上面的式子就是:
\[f'_i=h'_i+\sum_{k<i} f'_k\times x^{s_{k,i}}g_{k,i}
\]
其实就是右移,相加。
最后通过\(f'\)还原到\(f\)只需要实现右移\(1\)即可。
代码非常好写。
例题:SRM 761 div1 Level 3 SpanningSubgraphs
题解+代码:SRM 761 div1 Level 3 SpanningSubgraphs 题解 - QQQ,,, - 博客园 (cnblogs.com)