伯努利数是定义在实数上的一个数列,其在\(\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))); }
多项式求逆不想写了,之后遇到题再写吧