這篇寫好之後屯了很久,好像沒有什麼能增補的了,只好發上來了。
參考資料:
感謝yanqval和11dimensions對本文的幫助。由於早就成為一名嘴巴選手了,所以本文中的所有東西都沒有寫過= =
首先是定義。簡單地說,對於n個變數$x_1,x_2...x_n$,k項初等對稱多項式就是每種從n個變數中任選k個的方案選出變數乘積之和。
形式地說,k項初等對稱多項式$e_k(x_1,x_2...x_n)=\sum_^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_^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_^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_^x e_if_(-1)^i=-xe_x(-1)^x$,那麼它就是乙個多項式除法的形式,多項式除法即可。o(nlogn)。
既然有了初等對稱輪換多項式,我們可以求出$\sum_^n x_i^k$,那麼給定$\sum_^n x_i^k$,我們可以求出初等對稱輪換多項式的值嗎?
答案是肯定的,不過形式更加複雜,由維基百科:
upd:推導可見 e題題解,懶得再打一遍了
使用多項式exp即可在o(nlogn)的時間內求出e(聽起來就很慢)。當然直接用上面的那些式子就能做到平方。
多項式簡單應用
求 displaystyle sum na i cdot b i 對於求 displaystyle sum na i cdot b i 把b陣列翻轉一下,等價於求 displaystyle sum na i cdot b 這不就是乙個卷積嘛,時間複雜度 theta nlog n 你可能會說時間複雜度...
C語言的簡單應用 陣列實現多項式
這是乙個基於陣列實現的乙個簡單多項式結構 主要的缺點就是會浪費很大記憶體空間 include include include define max 100 typedef struct node polymariol 把多項式初始化為0 void zero polymariol poly poly ...
關於多項式的簡單思想
我們常見的多項式是這樣子的 y 1x 3 2x 2 3x 15 當x取值為2的時候,我們怎麼進行計算呢?第一步 變成有規律可尋的公式 y 1x 2 x 3 x 15 package suanfa public class poly return result public static void m...