1. 程式人生 > >關於多項式的一些東西

關於多項式的一些東西

泰勒展開

\(f(x)\)\(x_0\)處可導,且存在無窮階導數,那麼根據泰勒展開,有:
\[f(x) = \sum_{i=0}^{\inf} \frac{f^{[i]}(x_0)}{i!}(x-x_0)^i + \delta\]
其中\(\delta\)是一個餘項,表示一個趨近於無窮小的誤差。每展開一項,誤差就越小。
\(f(x)\)\(x_0 = 0\)處可導,帶入泰勒展開式後可以得到\(f(x)\)的麥克勞林展開式:
\[f(x) = \sum_{i=0}^{\inf} \frac{f^{[i]}(0)}{i!}x^i + \delta\]
一般來說,資訊學奧賽中都會使用麥克勞林展開式。我們可以將\(e^x\)

用麥克勞林展開:
\[e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + ... + \delta = \sum_{i=0}^{\inf} \frac{x^i}{i!} + \delta\]
這個式子將在後面反覆用到,是非常重要的式子。

牛頓迭代法

給定一個關於\(B(x)\)的函式\(F\),求\(F(B(x)) = 0(mod\ x^t)\)
我們令\(B_t(x)\)表示模\(x^{2^{t}}\)意義下的一個解。
那麼,對\(F(B_{t+1}(x))\)\(B_{t}(x)\)處進行泰勒展開有:
\[F(B_{t+1}(x)) = F(B_t(x)) + \frac{F'(B_t(x))}{1!} (B_{t+1}(x) - B_t(x)).....\]


\(deg(B_{t+1}(x) - B_t(x))^2 = 2^{t+2}-1\geq 2^{t+1}\)
所以除了最前面的兩項,其他項的結果都為\(0\)
所以
\[F(B_{t+1}(x)) = F(B_t(x)) + \frac{F'(B_t(x))}{1!} (B_{t+1}(x) - B_t(x))\]
化簡可得:
\[B_{t+1}(x) = B_{t}(x) - \frac{F(B_t(x))}{F'(B_t(x))}\]

利用牛頓迭代,我們就能夠解決多項式的各種基本運算了。

多項式基本運算

乘法就不說了,\(FFT\)\(NTT\)\(MTT\)、分治\(FFT\)

等 都是基本功。

多項式求導與積分

  • 求導\((c(x^a))' =cax^{a-1}\)
  • 積分\(\int cx^a = \frac{cx^{a+1}}{a+1}\)

求導後,預設最高項等於\(0\)。積分後,預設最低項等於\(0\)

多項式求逆

牛頓迭代得出的運算重點推導這一個,剩下的全部以給公式的形式呈現。
\(A_t(x)B_{t-1}(x) = 1\ \ \ \ \to \ \ \ \ A_t(x)B_{t-1}(x) - 1 = 0\)
然後套牛頓迭代就行了:
\[B_{t}(x) = B_{t-1}(x) - \frac{A_t(x)B_{t-1}(x) - 1}{A_t(x)} = 2B_{t-1}(x) - A_t(x)B_{t-1}^2(x)\]
多項式\(A(x)\)存在逆的條件:常數項\(\neq 0\)
注意一下,由於\(B_t(x)\)\(A_t(x)\)的第\(2^{t}\)項是沒有值的,所以傳參\(len\)時可以減少一倍。

多項式求\(ln\)

不需要牛頓迭代推出的運算重點推導這一個,剩下的全部以給公式的形式呈現。
\(lnA(x) = B(x) \ \ \ \ \to \ \ \ \ B'(x) = \frac{A'(x)}{A(x)}\)
然後好像就沒了......求逆後積分回去就行了。

其餘多項式運算

全部給公式了,推導都是一樣的。

  • 快速冪:\(B(x) = e^{K ln(A(x))}\)
  • 開根:\(B_t(x) = \frac{1}{2}(B_{t-1}(x) + \frac{A_t(x)}{B_{t-1}(x)})\)
  • \(exp\)\(B_t(x) = B_{t-1}(x)(1 - ln(B_{t-1}(x)) + A_t(x))\)

注意一下,求\(ln\)前常數項必須為\(1\),求\(exp\)前常數項必須為\(0\)

多項式乘法在串匹配中的應用

特徵:字符集極小或存在萬用字元
建模技巧:

  • 允許存在不超過\(K\)的偏移量:直接將當前列舉字元向左右擴充套件\(K\)格(差分實現)。
  • 存在萬用字元:令萬用字元\(S_i = T_j = 0\)
    則把匹配條件變為\(0 = \sum_{i=1}^{|T|} (S_{i+st} - T_i)T_iS_{i+st}\),拆式子後\(FFT\)

匹配方法:

  • 常規匹配:形如\(i_S - j_T = c\),反向\(FFT\)/\(NTT\)處理
  • 對稱匹配:形如\(i_S + j_S = 2 * k_T\),正向\(FFT\)/\(NTT\)處理。

這類題目只要認真分析+胡思亂想總能想出來的,關鍵還是在於對字串的理解。

生成函式簡介

生成函式就是母函式。
母函式可以推導遞推公式的通項公式,但是那一套就不說了,跟多項式關係也不大。
生成函式有兩種,普通型\(G(x) = \sum_{i=0}^{\inf} g_i x^i\)與指數型\(F(x) = \sum_{i=0}^{\inf} f_i \frac{x^i}{i!}\)
一般來說,有序問題會使用指數型,而組合問題會使用普通型。
普通型沒啥好說的吧......
指數型母函式就是\(e^x\)的展開式,故可以有一些騷套路:

  • \(e^{-x} = 1 - \frac{x}{1!} + \frac{x^2}{2!} - \frac{x^3}{3!}......\)
  • 只要奇數項:\(\frac{e^x - e^{-x}}{2}\)
  • 只要偶數項:\(\frac{e^x + e^{-x}}{2}\)
  • \(e^{nx} = 1 + \frac{(nx)}{1!} + \frac{(nx)^2}{2!} + \frac{(nx)^3}{3!}......\)

指數型母函式的係數本質就是多了一個可重排列\(\frac{(\sum_{i=1}^ma_i)!}{a_1!a_2!...a_m!}\)
我們使用泰勒展開還可以得到廣義二項式定理:

  • $(1+x)^m = 1 + \frac{m}{1!} x + \frac{m(m-1)}{2!}x^2 + ... + \frac{m(m-1)...2*1}{m!} x^m $
  • \((1-x)^m = 1 - \frac{m}{1!} x + \frac{m(m-1)}{2!} x^2 - \frac{m(m-1)(m-2)}{3!}x^3 + ... \frac{m(m-1)...2*1}{m} x^m\)
  • \((1+x)^m = \binom{m}{m} + \binom{m}{m-1}x + \binom{m}{m-2}x^2 +... \binom{m}{0} x^m\)
  • \((1-x)^m = \binom{m}{m} - \binom{m}{m-1}x + \binom{m}{m-2}x^2 + ... \binom{m}{0} x^m\)

這玩意兒在手算題裡有奇效,得到形如\(\frac{1}{(1-x)^k}\)的生成函式後,可以通過這個直接得到第\(r\)項係數。
最後:
關於選擇、組合問題請多想生成函式!!!
關於選擇、組合問題請多想生成函式!!!
關於選擇、組合問題請多想生成函式!!!

若干有用的科技/套路

簡單(單項)多項式手動求\(ln\)

當出現求\(ln F(x)\),其中\(F(x)\)只包含一個形如\(x^t\)的項時,可以考慮手動求\(ln\)
手動求\(ln\)的方法為:先求導,然後把分母展開為生成函式,最後積分得到答案。
給一個例子:\(F(x) = ln (1-x^t)\)
\[F(x) = \int F'(x) = \int \frac{-tx^{t-1}}{1-x^t} = \int -tx^{t-1} \sum_{i=0}^{\inf} x^{ti}\]
繼續:
\[F(x) = -\int \sum_{i=0}^{\inf} tx^{t(i+1)-1} = -\sum_{i=1}^{\inf}\frac{tx^{ti}}{ti} = -\sum_{i=1}^{\inf} \frac{x^{ti}}{i}\]
這個技巧可謂是相當相當相當的關鍵了,下面的一些推導中,還會反覆使用到這個技巧。

組合關係的生成函式拆分

給定一個形如\(h_x = \sum_{i=0}^{n} \binom{n}{i}f_ig_{n-i}\)
\(h_i\)\(g_i\)好求,需要求\(f_i\),那麼我們可以把組合數拆開後這麼做:
\[\frac{h_n}{n!} = \sum_{i=0}^n \frac{f_i}{i!} \frac{g_{n-i}}{(n-i)!}\]
接著構造生成函式\(H(x) =\sum_{i=0}^{\inf} \frac{h_i}{i!}x^i\)\(F(x)=\sum_{i=0}^{\inf} \frac{f_i}{i!}x^i\)\(G(x)=\sum_{i=0}^{\inf} \frac{g_i}{i!}x^i\)
那麼有\(H(x) = F(x)G(x)\)
所以\(F(x) = \frac{H(x)}{G(x)}\),通過多項式求逆得到\(F(x)\)後即可得到\(f_i\)

劃分關係與指數型生成函式

\(F(x) = \sum_{i=1}^n f_i \frac{x^i}{i!}\),其中\(f_i\)表示\(i\)個元素的\(A\)集合的種類數。
同理我們設\(G(x) = \sum_{i=0}^n g_i \frac{x^i}{i!}\),其中\(g_i\)表示\(i\)個元素的\(B\)集合的種類數。
若所有元素都有編號,且\(B\)集合是由若干\(A\)集合構成的,那麼有:
\[G(x) = e^{F(x)}\]
幾個例子:

  • \(F(x)\)為簡單有向聯通圖的生成函式,\(G(x)\)為簡單有向圖的生成函式。
  • \(F(x)\)為要求聯通的\(DAG\)的生成函式,\(G(x)\)為不要求聯通的\(DAG\)的生成函式。

證明:把\(e^{F(x)}\)泰勒展開後有:\(e^{F(x)} = \sum_{i=0}^n \frac{F(x)^i}{i!}\)
然後我們考慮\(G(x)\)中的每一項的構成:
\[[x^n]G(x) = x^n\sum_{k=1}^n \frac{[x^n](F(x)^k)}{k!} = x^n\sum_{k=1}^n [\frac{\frac{f_{a_1}f_{a_2}...f_{a_k}}{a_1!a_2!...a_k!}}{k!}] = \frac{x^n}{n!} \sum_{k=1}^n [(\frac{f_{a_1}f_{a_2}...f_{a_k}}{a_1!a_2!...a_k!})\frac{n!}{k!}]\]
可以注意到\(\frac{n!}{a_1!a_2!...a_k!}\)正是可重排列編號的方案數,而\(\frac{1}{k!}\)對應構成\(B\)\(A\)集合之間無順序關係。

快速求\(R(x) = \prod_i^m (1-x^{t_i})\ \ (mod\ x^{n})\)

一般的揹包問題其實就是若干\(T(x) = \frac{1}{1-x^{V_i}}\)捲起來,所以這個東西可以解決揹包問題。
顯然不能直接分治\(NTT\),但我們可以在\(O(nln(n)+nlog^2n)\)的時間內求出這個式子。
先求\(G(x) = \prod_i^m \frac{1}{(1-x^{t_i})}\),設\(F_i(x) = \frac{1}{(1-x^{t_i})}\),那麼
\[G(x) = e^{\sum_{i=1}^m ln(F_{i}(x))}\]

最後再對\(G(x)\)求逆即可得到答案。
考慮求\(Ans(x) = \sum_{i=1}^m ln(F_i(x))\),顯然不能對每一項直接求\(ln\)
我們嘗試兩邊求導得:\(Ans = \int \sum_{i=1}^m (ln(F_{i}(x)))'\)。然後化簡\((ln(F_i(x)))'\)有:
\[(lnF_i(x))' = \frac{F_i'(x)}{F_i(x)} = (1-x^{t_i})(\sum_{j=0} x^{jt_i})' = (1-x^{t_i})(\sum_{j=1} t_jjx^{jt_i-1})\]

把上式錯位相減後有:\((lnF_i(x))' =\sum_{j = 1} t_i x^{jt_i - 1}\),所以有:
\[Ans(x) = \int \sum_{i=1}^m(lnF_i(x))' = \sum_{i=1}^m \int \sum_{j=1} t_ix^{jt_i-1} = \sum_{i=1}^m \sum_{j=1} \frac{x^{jt_i}}{j}\]

於是乎,首先統計每種\(t\)的數量\(cnt_{t}\),然後暴力給\(Ans(x)\)加貢獻即可,複雜度調和級數。

快速求\(\sum_{i=1}^n a_i^k , k\in[1,t]\)

\(O(nk)\)顯然是假的,這輩子都不可能這麼簡單的。
構造\(F(x) = \prod_{i=1}^n (a_ix + 1)\)
那麼\(lnF(x) = \sum_{i=1}^n ln(a_ix+1)\),考慮手動求\(ln\)
\[ln(a_ix+1) = \int \frac{a_i}{1+a_ix} = a_i \int \sum_{j=0}^{\inf}(-a_i)^j x^j = \sum_{j=1}^{\inf}\frac{(-1)^{j-1}}{j}a_i^jx^j\]
所以\(lnF(x) = \sum_{i=1}^n \sum_{j=1}^{\inf} \frac{(-1)^{j-1}}{j}a_i^j x^j = \sum_{j=1}^{\inf}\frac{(-1)^{j-1}}{j} \sum_{i=1}^n a_i^j x^j\)
\(F(x)\)可以同過分治\(FFT\)求出,所以求出\(F(x)\)後,對\(F(x)\)\(ln\)得到每一項的係數即可。

快速求\(\sum_{i=1}^n \sum_{j=1}^m (a_i + b_j)^k , k\in [1,t]\)

把式子暴力化開:\(f(x) = \sum_{i=1}^n \sum_{j=1}^m (a_i + b_j)^x = \sum_{i=1}^n \sum_{j=1}^m \sum_{k=0}^x a_i^k b_j^{x-k} \binom{x}{k}\)
所以有:
\[f(x) = x!\sum_{k=0}^x \frac{\sum_{i=1}^n a_i^k}{k!} \frac{\sum_{j=1}^m b_j^{x-k}}{(x-k)!}\]
而我們已經會快速求\(\sum_{i=1}^n a_i^k\)了,所以只需要構造卷積再套一次\(FFT\)即可。