生成函數

1.普通生成函數OGF\texttt{OGF}
對於無順序的計數
f(x)=i=0aixif(x) = \sum_{i=0} a_ix^i
這裏的xx是形式冪級數,我們不關心xx的具體取值,我們只關心繫數,可以通過複分析證明可以無視收斂條件化簡:i=0xi=11x\sum_{i=0} x^i = \frac 1{1-x}

Ex1 : 求出 Ai = i*i 的生成函數\texttt{Ex1 : 求出 Ai = i*i 的生成函數}
考慮f(x)=i=0ixi=i=1xij=0xj=x1x11xf(x) = \sum_{i=0} ix^i = \sum_{i=1}x^i\sum_{j=0}x^j = \frac x{1-x} \cdot\frac 1{1-x}
A(x)=i=0iixi=i=0(i1)ixi+ixi=x(1x)2+i=2xij=0jxj=x(1x)2+x21xx(1x)2=x3x2+x(1x)3\therefore A(x) = \sum_{i=0} i*ix^i = \sum_{i=0} (i-1)ix^i + ix^i \\= \frac x{(1-x)^2} + \sum_{i=2} x^i\sum_{j=0}jx^j \\=\frac x{(1-x)^2} + \frac {x^2}{1-x} \cdot \frac x{(1-x)^2} = \frac {x^3-x^2+x}{(1-x)^3}

2.指數生成函數
對於有順序的計數。
f(x)=i=0aixii!f(x) = \sum_{i=0} \frac {a_ix^i}{i!}
卷積時自帶排列。

3.FFT
4.循環卷積。
5.二維循環卷積
參考多維DFT\texttt{DFT}

6.bluestein算法
https://blog.csdn.net/outer_form/article/details/52386685
計算n位循環卷積的方法。

(mod1163962801)\pmod{1163962801}
這是1~22的lcmlcm,他有2到22次單位根,可以直接在模意義下的環內用整數做DFT\texttt{DFT}

7.單位根反演。
我博客裏有。

一個圖中,求走過步數i爲KK的倍數的路徑的(ni)\binom{n}{i}之和。
首先可以讓每個點連一個自環,那麼長度爲i的路徑到n時就會選擇n-i個時刻走自環,那麼就可以解決這個組合數了。
然後直接上單位根反演,把走一步後乘上wni,i[0,K1]w_n^i,i\in[0,K-1] 加起來除以KK就行了。

其實也可以矩陣中每個元素維護一個K1K-1次多項式,然後做長度爲KK的循環卷積,最後插值回去,並無大差異。

8.Polya生成函數
有一個長度爲nn的項鍊,mm種顏色。
求對於顏色ii用了CiC_i個的在旋轉置換下的等價類數。
對於置換(移動pp位)的不動點的生成函數:fp(x1,x2,x3..xm)=(i=1mxigcd(p,n))ngcd(p,n)f_p(x_1,x_2,x_3..x_m) = (\sum_{i=1}^m x_i^{gcd(p,n)})^{\frac n{gcd(p,n)}}
對於等價類的生成函數:F(x1,x2....xm)=pfp(x1,x2...xm)nF(x_1,x_2....x_m) = \frac {\sum_p f_p(x_1,x_2...x_m)}n
算就是了。

9.多項式可以執行的操作
Ⅰ:多項式牛頓迭代:
對於f(x)f(x)展開一階即認爲f(x)=f(x0)+f(x0)(xx0)f(x) = f(x_0) + f'(x_0) * (x-x_0)
然後求f(x)=0f(x) = 0xx的解。
x=f(x0)f(x0)f(x0)x = f'(x_0) - \frac {f(x_0)}{f'(x_0)}
不斷用x0x_0求出新的xx,把x0=xx_0 = x,如果f(x)=0f(x)= 0則結束。
對於多項式我們來抽象的實現牛頓迭代。
A(x)=f(B(x))f(B(x))f(B(x))A(x) = f'(B(x)) - \frac {f(B(x))}{f'(B(x))}
每次多項式長度都會*2.
Ⅱ:多項式求逆:
A(x)=1B(x)A(x) = \frac 1{B(x)}
注意把A(x)1B(x)=0A(x) - \frac 1{B(x)} = 0牛頓迭代是有坑點的,需要特殊理解。
ⅠⅠⅠ:多項式除法。
A(x)=B(x)C(x)+D(x)A(x) = B(x)C(x) + D(x)
A(1x)=B(1x)C(1x)+D(1x)A(\frac 1x) = B(\frac 1x)C(\frac 1x) + D(\frac 1x)
xdeg(A)A(1x)=xdeg(B)B(1x)xdeg(C)C(1x)+xdeg(A)D(1x)x^{deg(A)} A(\frac 1x) = x^{deg(B)}B(\frac 1x)x^{deg(C)}C(\frac 1x) + x^{deg(A)}D(\frac 1x)
最後一項因爲deg(D)<deg(B)deg(D) < deg(B)所以在(modxdeg(A)deg(B)+1)\pmod {x^{deg(A)-deg(B)+1}}的意義下是0.
對於A,B,C都只相當於把多項式的係數反轉。
那麼就可以算出C,然後算出DD.
Ⅳ:多項式多點求值:
對於f(x)= sumi=0naixif(x)= \ sum_{i=0}^n a_ix^if(x1),f(x2)...f(xm)f(x_1),f(x_2)...f(x_m)
設一個多項式π(i,j)=ij(xxi)\pi(i,j) = \prod_{i}^j (x-x_i)
f(x)g(x)(modπ(1,k))f(x) \equiv g(x) \pmod{\pi(1,k)}
所以因爲f(xi)=f(x)(modxxi)=g(xi)f(x_i) = f(x) \pmod {x-x_i} = g(x_i)
這樣就可以類線段樹分治,每次兩個多項式取模把多項式次數減半。
V:多項式快速插值
用多項式科技優化拉格朗日插值。
發現可以直接分治,左半插值,右半插值,fl,r=fl,midπmid+1,r+fmid+1,rπl,midf_{l,r} = f_{l,mid}\pi_{mid+1,r} + f_{mid+1,r}\pi_{l,mid} ,兩個log\log美滋滋。但是初值需要知道yi=F(xi)j!=i(xixj)y_i = \frac {F(x_i)}{\prod_{j!=i} (x_i-x_j)}
Pi(x)=j(xxj)(xxi)P_i(x) = \frac {\prod_j(x-x_j)}{(x-x_i)}
那麼yi=F(xi)Pi(xi)y_i = \frac {F(x_i)}{P_i(x_i)}
那麼我們就需要算出Pi(xi)P_i(x_i)
以小學生的素養知道分母爲0 ,再用小學生就應該會的微積分中的洛必達法則得出Pi(xi)=(j(xxj))xiP_i(x_i) = \frac {(\prod_j(x-x_j))'}{-x_i}
對分子多項式多點求值就行了。
Ex1:Ex1:分拆數
求對於nn的不下降可重分拆方案數。
不是五邊形數的那個!!!!
推式子後expexp
注意EGF的組合意義不要亂用。


開始線代?
範德蒙德矩陣
它的行列式j<i(xixj)\prod_{j<i} (x_i-x_j)可以用巧妙一下用多點求值。

Ex2\texttt{Ex2}
給出f(x)=i=0n(1aixi)f(x) = \prod_{i=0}^n (1-a_ix^i),g(x)=i=0n(1bixi)g(x) = \prod_{i=0}^n (1-b_ix^i)
h(x)=i=0nj=0n(1aibjxi+j)h(x) = \prod_{i=0}^n\prod_{j=0}^n (1-a_ib_jx^{i+j})
泰勒展開ln(f(x))=k>0(1)k1kxk(i=0naik)ln(f(x)) = \sum_{k>0} \frac {(-1)^{k-1}}{k}x^k(\sum_{i=0}^na_i^k)
ln(h(x))=k>0(1)k1kxk(i=0nj=0naikbjk)ln(h(x)) = \sum_{k>0} \frac {(-1)^{k-1}}kx^k(\sum_{i=0}^n\sum_{j=0}^na_i^kb_j^k)
解出i=0naik\sum_{i=0}^na_i^k,i=0nbik\sum_{i=0}^nb_i^k就可以直接推出ln(h(x))\ln(h(x))

常係數線性遞推。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章