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

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

参考资料:

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}^ne_ix^i=0的n个解的相反数的倒数,这等价于求一个n次方程的根。

例1 thupc problem I

给出n个整数x_1,x_2...x_n,对于每个1\leq{k}\leq{n},求\sum_{i=1}^nx_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}^nx_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}^nx_i^k,那么给定\sum_{i=1}^nx_i^k,我们可以求出初等对称轮换多项式的值吗?

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

image

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

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