初等对称轮换多项式简单应用

这篇写好之后屯了很久,好像没有什么能增补的了,只好发上来了。

参考资料:

https://en.wikipedia.org/wiki/Newton%27s_identities

https://en.wikipedia.org/wiki/Elementary_symmetric_polynomial

感谢yanqval和11dimensions对本文的帮助。由于早就成为一名嘴巴选手了,所以本文中的所有东西都没有写过= =

首先是定义。简单地说,对于n个变量$x_1,x_2...x_n$,k项初等对称多项式就是每种从n个变量中任选k个的方案选出变量乘积之和。

形式地说,k项初等对称多项式$e_k(x_1,x_2...x_n)=\sum_{1\leq j_1<j_2...j_k\leq n}x_{j_1}x_{j_2}...x_{j_k}$。特殊地,k=0时$e_k=1$,k>n时$e_k=0$。

首先,对于一个给定的数列$x_1,x_2...x_n$,如何求出$e_0,e_1...e_n$?简单,$e_i=[p^i]\prod_i (x_ip+1)$,只需要用分治FFT计算$\prod_i (x_ip+1)$每项系数即可。O(nlog^2n)。

那么给出$e_0,e_1...e_n$,可以求出$x_1,x_2...x_n$吗?仔细一想你会发现由于上面的式子,$x_1,x_2...x_n$即为$\sum_{i=0}^n e_i x^i=0$的n个解的相反数的倒数,这等价于求一个n次方程的根。

例1 thupc problem I

给出n个整数$x_1,x_2...x_n$,对于每个$1 \leq k \leq n$,求$\sum_{i=1}^n x_i^k$,对998244353取模。n<=100000。

这题乍看起来奥妙重重,既然放在这篇文章里,肯定和这些多项式有关对吧,我们来找找规律...

a^2+b^2+c^2+d^2=(a+b+c+d)^2-2ab-2ac-2ad-2bc-2bd-2cd

a^3+b^3+c^3+d^3=(a^2+b^2+c^2+d^2)(a+b+c+d)-(a+b+c+d)*(ab+ac+ad+bc+bd+cd)+3(abc+abd+acd+bcd)

咦好像有点规律啊。我们令$f_k=\sum_{i=1}^n x_i^k$,那么可以发现:

f[1]=e[1]

f[2]=f[1]*e[1]-2*e[2]

f[3]=f[2]*e[1]-f[1]*e[2]+3*e[3]

f[4]=f[3]*e[1]-f[2]*e[2]+f[1]*e[3]-4*e[4]

直接分治fft当然就可以,O(nlog^2n)。

不妨设f[0]=0,那么$\sum_{i=0}^x e_if_{x-i}(-1)^i=-xe_x(-1)^x$,那么它就是一个多项式除法的形式,多项式除法即可。O(nlogn)。

既然有了初等对称轮换多项式,我们可以求出$\sum_{i=1}^n x_i^k$,那么给定$\sum_{i=1}^n x_i^k$,我们可以求出初等对称轮换多项式的值吗?

答案是肯定的,不过形式更加复杂,由维基百科:

image

使用多项式exp即可在O(nlogn)的时间内求出e(听起来就很慢)。当然直接用上面的那些式子就能做到平方。

posted @ 2017-07-31 19:34 fjzzq2002 阅读(...) 评论(...) 编辑 收藏