經過一天的學習,我們發現伯努利數是個非常有用 (個屁) 的數列
定義
但是...伯努利數是什么呢?我們先給伯努利數一個定義:
令 \(B(i)\) 表示 伯努利數第 i 項,那么有:
當然 \(B_0=1\) ,於是上面的式子就可以一直推下去了...
暴力計算
我們按照上面的式子可以算出:
但是這樣的效率嘛 【滑稽
當然是 \(n^2\) 的啦~ 於是我們試圖尋找更高效的辦法...
高效計算
我們發現,根據定義有這么個等式:
這里原本 n 是 n+1 的,為了方便我們把 n 帶進去...
然后這個式子有什么用呢?當然有用咯~ 這玩意兒可是能化成卷積的形式丫!
於是拆個組合數玩玩,看這里:
我們發現 \(n=0\) 時,其實也滿足上面的式子,只要我們定義 \(0!=1\)
注意上面的 n 仍然不等於 1 ...
然后我們是不是發現這玩意兒左邊其實是...卷積呢!\(1\over i!\) 不就是每項系數為 1 的多項式指數函數?
我們把伯努利數除去階乘當做是一個多項式的系數,那么原來的式子就可以搞生成函數了!
但我們首先還要把 n=1 的情況加進去:
你問我為什么這么寫?暴力算一下 n=1 的情況不就發現兩邊差了多少嘛!
然后轉個多項式我們就可以開始生成函數了 QVQ
這里之所以加了 x 是因為上面的 \(x^1\) 系數多了個 1
然后我們繼續推式子:
也就是說,我們只要階乘算出來整體左移一位然后求個逆就好了
但是這里要注意的是,我們這樣求出的是指數型生成函數的伯努利數的多項式,真正的伯努利數列要在我們求出來這個多項式系數的基礎上乘上對應的階乘(也就是在指數型生成函數的多項式中除去的那個階乘)
code
代碼如下...丑的一比...而且還省去了求逆的具體函數...
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^+\) 有什么用么?或者說什么特殊的性質?
當然是有的咯,對於下面要說的 \(S(n,k)\) 這個冪和函數,如果 \(S(n,k)\) 是這么定義的:
那么令 \(B_i\) 表示伯努利數列 \(B^+\) 的第 i 項,則有:
好像並沒有什么軟用...但是有時候要用到的話可能會讓你的推出來的式子更加簡潔?【霧
模板
然后這里是板子題:
\(n^2\) 暴力足以優雅水過~
要用任意MTT喲~
題解點這里
應用
伯努利數有個非常良好 (個屁) 的性質:
令:
則:
即:
PS:關於上面等式的證明可以看這里
然后一系列推倒:
這可不就是卷積的形式嘛!
現在我們就可以在一些 (dl)數學題里面大展拳腳了呢~
比如這道:
題解點這里