通過一天的學習,咱們發現伯努利數是個很是有用 (個屁) 的數列html
可是...伯努利數是什麼呢?咱們先給伯努利數一個定義:函數
令 \(B(i)\) 表示 伯努利數第 i 項,那麼有:學習
\[\sum_{i=0}^{n} \begin{pmatrix} n+1\\i \end{pmatrix} B_i=0 ,~~ n>0\]spa
固然 \(B_0=1\) ,因而上面的式子就能夠一直推下去了...code
咱們按照上面的式子能夠算出:htm
\[B_0=1,B_1=-{1\over2},B_2={1\over 6},B_3={0},B4={1\over 30}······\]blog
可是這樣的效率嘛 【滑稽get
固然是 \(n^2\) 的啦~ 因而咱們試圖尋找更高效的辦法...數學
咱們發現,根據定義有這麼個等式:模板
\[\sum_{i=0}^{n}\begin{pmatrix} n\\i \end{pmatrix} B_i = B_n ,n>1\]
這裏本來 n 是 n+1 的,爲了方便咱們把 n 帶進去...
而後這個式子有什麼用呢?固然有用咯~ 這玩意兒但是能化成卷積的形式丫!
因而拆個組合數玩玩,看這裏:
\[\sum_{i=0}^{n}{ B_i\over i!(n-i)!} = {B_n\over n!} ,n>1\]
咱們發現 \(n=0\) 時,其實也知足上面的式子,只要咱們定義 \(0!=1\)
\[\sum_{i=0}^{n}{ B_i\over i!} {1\over (n-i)!} = {B_n\over n!} ,n\neq1\]
\[\sum_{n=0,n\neq1}^{\infty}\sum_{i=0}^{n}{ B_i\over i!}~ · {1\over (n-i)!} = \sum_{n=0,n\neq1}^\infty {B_n\over n!} \]
注意上面的 n 仍然不等於 1 ...
而後咱們是否是發現這玩意兒左邊實際上是...卷積呢!\(1\over i!\) 不就是每項係數爲 1 的多項式指數函數?
咱們把伯努利數除去階乘當作是一個多項式的係數,那麼原來的式子就能夠搞生成函數了!
但咱們首先還要把 n=1 的狀況加進去:
\[\sum_{n=0,n\neq1}^{\infty}\sum_{i=0}^{n}{ B_i\over i!}~ · {1\over (n-i)!} = \sum_{n=0,n\neq1}^\infty {B_n\over n!} \]
\[\sum_{n=0}^{\infty}\sum_{i=0}^{n}{ B_i\over i!}~ · {1\over (n-i)!} = \sum_{n=0}^\infty {B_n\over n!} +[n=1] \]
你問我爲何這麼寫?暴力算一下 n=1 的狀況不就發現兩邊差了多少嘛!
而後轉個多項式咱們就能夠開始生成函數了 QVQ
\[\sum_{n=0}^{\infty}\Big(\sum_{i=0}^{n}{ B_i\over i!}~ · {1\over (n-i)!}\Big) x^n = \sum_{n=0}^\infty \Big( {B_n\over n!} +[n=1] \Big) x^n\]
\[\sum_{n=0}^{\infty} \sum_{i=0}^{n}{ B_i\over i!}x^i~ · {1\over (n-i)!} x^{n-i} = \sum_{n=0}^\infty \Big( {B_n\over n!} +[n=1] \Big) x^n\]
\[B(x)e^x=B(x) +x\]
這裏之因此加了 x 是由於上面的 \(x^1\) 係數多了個 1
而後咱們繼續推式子:
\[B(x)={x\over e^x-1}\]
\[B(x)=({e^x-1\over x})'\]
也就是說,咱們只要階乘算出來總體左移一位而後求個逆就行了
可是這裏要注意的是,咱們這樣求出的是指數型生成函數的伯努利數的多項式,真正的伯努利數列要在咱們求出來這個多項式係數的基礎上乘上對應的階乘(也就是在指數型生成函數的多項式中除去的那個階乘)
代碼以下...醜的一比...並且還省去了求逆的具體函數...
inline void prep(int len){ B[0]=ifac[0]=ifac[1]=fac[0]=fac[1]=1; fp(i,2,len) ifac[i]=mul(mod-mod/i,ifac[mod%i]); fp(i,2,len) ifac[i]=mul(ifac[i-1],ifac[i]); fp(i,2,len) fac[i]=mul(fac[i-1],i); get_inv(ifac+1,B,len); fp(i,2,len) B[i]=mul(B[i],fac[i]); }
伯努利數其實分兩類: \(B^+\) 和 \(B^-\) ,咱們上面討論的是 \(B^-\) ,這二者...惟一的區別就是 \(B_1\) 一個是正的一個是負的,具體而言,對於伯努利數列的每一項有: $B_i^+ = (-1)^i B_i^- $ ,但因爲伯努利數列的奇數項 \(B_{2n+1}\) 在 \(n>1\) 的狀況下都是等於 0 的,因此兩個數列惟一不一樣的就是 \(B_1\) 這一項了
那麼咱們從新寫一遍伯努利數列就是:
\[B_0=1,B_1^{±}=±{1\over 2} ,B_2={1\over 6},B_3=0,B4={1\over 30}······\]
那麼另外一種不大常見的 \(B^+\) 有什麼用麼?或者說什麼特殊的性質?
固然是有的咯,對於下面要說的 \(S(n,k)\) 這個冪和函數,若是 \(S(n,k)\) 是這麼定義的:
\[S(n,k)=\sum_{i=0}^n i^k\]
那麼令 \(B_i\) 表示伯努利數列 \(B^+\) 的第 i 項,則有:
\[S(n,k)={1\over k+1} \sum_{i=0}^k \begin{pmatrix} k+1 \\ i \end{pmatrix} B_i n^{k+1-i} \]
好像並無什麼軟用...可是有時候要用到的話可能會讓你的推出來的式子更加簡潔?【霧
而後這裏是板子題:
\(n^2\) 暴力足以優雅水過~
要用任意MTT喲~
題解點這裏
伯努利數有個很是良好 (個屁) 的性質:
令:
\[S(n,k)=\sum_{i=1}^{n-1} i^k\]
則:
\[S(n,k)={1\over k+1} \sum_{i=0}^k \begin{pmatrix} k+1 \\ i \end{pmatrix} B_i n^{k+1-i} \]
即:
\[\sum_{i=1}^{n-1} i^k={1\over k+1} \sum_{i=0}^k \begin{pmatrix} k+1 \\ i \end{pmatrix} B_i n^{k+1-i}\]
PS:關於上面等式的證實能夠看這裏
而後一系列推倒:
\[{1\over k+1} \sum_{i=1}^{k+1} \begin{pmatrix} k+1 \\ k+1-i \end{pmatrix} B_{k+1-i} n^i\]
\[k! \sum_{i=1}^{k+1} {B_{k+1-i}\over (k+1-i)!} {n^i\over i!}\]
這可不就是卷積的形式嘛!
如今咱們就能夠在一些 (dl)數學題裏面大展拳腳了呢~
好比這道:
題解點這裏