通过一天的学习,咱们发现伯努利数是个很是有用 (个屁) 的数列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)数学题里面大展拳脚了呢~
好比这道:
题解点这里