zoukankan      html  css  js  c++  java
  • 初等对称轮换多项式简单应用

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

    参考资料:

    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_{1leq j_1<j_2...j_kleq 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

    UPD:推导可见 https://ddd.blog.luogu.org/LuoguContest5 E题题解,懒得再打一遍了

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

  • 相关阅读:
    堆和栈的区别
    熟悉熟悉常用的几个算法用JS的实现
    JS设置CSS样式的几种方式
    javascript的基本语法、数据结构
    DOM的概念及子节点类型
    三列自适应布局
    Javascript中括号“[]”的多义性
    Javascript中大括号“{}”的多义性
    Javascript小括号“()”的多义性
    JavaScript 开发者经常忽略或误用的七个基础知识点
  • 原文地址:https://www.cnblogs.com/zzqsblog/p/7265111.html
Copyright © 2011-2022 走看看