伯努利數是定義在實數上的一個數列,其在\(\rm OI\)中的用處大多都是處理天然數冪和。函數
咱們定義伯努利數\(B_i\)知足:
\[ B_0=1,\sum_{i=0}^{n}\binom{n+1}{i}B_i=0\ (n>0) \]
那麼易得:
\[ B_0=1,B_1=-\frac{1}{2},B_2=\frac{1}{6},B_3=0,B_4=-\frac{1}{30},B_5=0,... \]
注意到奇數位除了\(B_1\)都爲\(0\)。spa
首先很顯然的咱們把定義式移個項就能夠獲得\(O(n^2)\)的作法:
\[ B_n=-\frac{1}{n+1}\sum_{i=0}^{n-1}\binom{n+1}{i}B_i \]code
其實咱們經過一些奧妙重重的方法能夠作到\(O(n\log n)\)。ci
咱們把定義式抄下來:
\[ \sum_{i=0}^{n}\binom{n+1}{i}B_i=0\\ \sum_{i=0}^{n-1}\binom{n}{i}B_i=0 \]
注意第二個式子要保證\(n>1\)。
\[ \sum_{i=0}^{n-1}\binom{n}{i}B_i+B_n=B_n\\ \sum_{i=0}^{n}\binom{n}{i}B_n=B_n\\ \sum_{i=0}^{n}\frac{B_i}{i!(n-i)!}=\frac{B_n}{n!} \]
注意到這是個卷積的形式,咱們寫出\(B_i\)的指數型生成函數:
\[ B(x)=\sum_{i=0}^{\infty}\frac{B_i}{i!}x^i \]
那麼顯然等式左邊就是\(B(x)\)捲上\(e^x\),可是注意到上面那個等式只在\(n>1\)時成立,咱們手玩一下\(n=0,1\)時卷積的樣子:
\[ \begin{align} B(x)e^x&=B_0+(B_0+B_1)x+\cdots\\ B(x)&=B_0+B_1x+\cdots \end{align} \]
顯然\(B(x)\)少了個\(B_0x=x\),咱們加上就行了,可得:
\[ B(x)e^x=B(x)+x\\ B(x)=\frac{x}{e^x-1} \]
那麼咱們直接多項式求逆就能夠作到\(O(n\log n)\)。get
定義:
\[ S_p(n)=\sum_{i=1}^{n}i^p \]
而後咱們搞出這個函數的指數型生成函數:
\[ \begin{align} G_n(x)&=\sum_{i=0}^{\infty}\frac{S_i(n)}{i!}x^i\\ &=\sum_{i=0}^{\infty}\frac{x^i}{i!}\sum_{j=1}^{n}j^i\\ &=\sum_{j=1}^{n}\sum_{i=0}^{\infty}\frac{(jx)^i}{i!}\\ &=\sum_{j=1}^{n}e^{jx}=\frac{e^{(n+1)x}-e^{x}}{e^x-1}\\ \end{align} \]class
後面一個是根據\(e^{F(x)}\)的定義來的,即:方法
\[ e^{F(x)}=\sum_{i=0}^{\infty}\frac{F^i(x)}{i!} \]di
注意到分母和\(B(x)\)長的同樣,咱們把\(B(x)\)套進去:
\[ \begin{align} G_n(x)&=B(x)\frac{e^{(n+1)x}-e^x}{x}\\ &=B(x)e^x\cdot \frac{1}{x}\cdot \left(-1+\sum_{i=0}^{\infty}\frac{n^ix^i}{i!}\right)\\ \end{align} \]
注意到前面有一個等式是這樣的:\(B(x)e^x=B(x)+x\)。co
因爲後面這個\(x\)很差處理,咱們定義一個新的伯努利數\(B'(x)=B(x)+x\),注意到這個新的數列只有第一項和伯努利數不一樣,\(B'(1)=-B(1)\)。display
由於只有一項不一樣,下面的式子爲了美觀把B'寫成了B
\[ \begin{align} G_n(x)&=\left(\sum_{i=0}^{\infty}\frac{B_i}{i!}x^i\right)\cdot \left(\sum_{i=0}^{\infty}\frac{n^{i+1}}{(i+1)!}x^i\right)\\ &=\sum_{i=0}^{\infty}x^i\sum_{j=0}^{i}\frac{n^{j+1}}{(j+1)!}\cdot \frac{B_{i-j}}{(i-j)!}\\ &=\sum_{i=0}^{\infty}\frac{x^i}{i!}\cdot \frac{1}{i+1}\sum_{j=0}^i\binom{i+1}{j+1}B_{i-j}n^{j+1} \end{align} \]
對比係數可知:
\[ \begin{align} S_i(n)&=\frac{1}{i+1}\sum_{j=0}^i\binom{i+1}{j+1}B_{i-j}n^{j+1}\\ &=\frac{1}{i+1}\sum_{j=0}^{i}\binom{i+1}{i-j+1}B_jn^{i-j+1}\\ &=\frac{1}{i+1}\sum_{j=0}^{i}\binom{i+1}{j}B_jn^{i-j+1}\\ \end{align} \]
那麼寫的好看一點,結論就是:
\[ \sum_{i=1}^{n}i^k=\frac{1}{k+1}\sum_{j=0}^{k}\binom{k+1}{j}B_jn^{k-j+1} \]
void get_Bernoulli() { b[0]=1; for(int i=1;i<N;i++) { for(int j=0;j<i;j++) b[i]=add(b[i],mul(b[j],c(i+1,j))); b[i]=del(0,mul(b[i],inv[i+1])); }b[1]++; //注意下這裏 } void get_coefficient() { s[0]=0; for(int i=0;i<=n;i++) s[y+1-i]=mul(inv[y+1],mul(b[i],c(y+1,i))); }
多項式求逆不想寫了,之後遇到題再寫吧