小粉兔原本对数学方面的知识(数论,计数)比较感兴趣,直到他考了 CTS2019 和 APIO2019,
发现他的数学居然连没怎么学的数据结构都不如,于是他自闭了。
考虑到从现在开始 CNOI 可能会变得计数和推式子化,小粉兔很可能要凉掉了。
现在补救可能还是来得及的(?),所以他推了一些式子尝试救起濒死的数学水平。
注意:以下内容极其低端,仅能体现 OIer 中数学的最低水平,请谨慎阅读!
注意:以下内容极其低端,仅能体现 OIer 中数学的最低水平,请谨慎阅读!
注意:以下内容极其低端,仅能体现 OIer 中数学的最低水平,请谨慎阅读!
考虑计算这样一个东西:\(\displaystyle\sum_{i=1}^{n}i^k\)。
即前 \(n\) 个正整数幂和,其中 \(0\le k\le 10^6\),\(1\le n\le 10^{18}\) 且均为整数。
设 \(\displaystyle S_k(n)=\sum_{i=1}^{n}i^k\),则显然对于 \(k\in\mathbb{N}\),\(S_k(x)\) 是关于 \(x\) 的一个 \(k+1\) 次多项式。
举几个例子:
- \(\displaystyle S_0(n)=\overset{n}{\overbrace{1+1+\cdots+1}}=n=\mathbf{OGF}\left\{\left[0,1\right]\right\}\)。
- \(\displaystyle S_1(n)=1+2+\cdots+n=\frac{n(n+1)}{2}=\frac{1}{2}n+\frac{1}{2}n^2=\mathbf{OGF}\left\{\left[0,\frac{1}{2},\frac{1}{2}\right]\right\}\)。
- \(\displaystyle S_2(n)=1^2+2^2+\cdots+n^2=\frac{n(n+1)(2n+1)}{6}=\frac{1}{6}n+\frac{1}{2}n^2+\frac{1}{3}n^3=\mathbf{OGF}\left\{\left[0,\frac{1}{6},\frac{1}{2},\frac{1}{3}\right]\right\}\)。
- \(\displaystyle S_3(n)=1^3+2^3+\cdots+n^3=\frac{n^2(n+1)^2}{4}=\frac{1}{4}n^2+\frac{1}{2}n^3+\frac{1}{4}n^4=\mathbf{OGF}\left\{\left[0,0,\frac{1}{4},\frac{1}{2},\frac{1}{4}\right]\right\}\)。
要如何求出 \(S_k(n)\) 呢?
观察到 \(S_k(n)\) 中包含许多 \(i^k\),可以联想到其出现在某些有相似特征的生成函数中,
比如 \(\displaystyle\mathbf{OGF}\left\{\left[1,a,a^2,a^3,\ldots\right]\right\}=\frac{1}{1-ax}\) 或 \(\displaystyle\mathbf{EGF}\left\{\left[1,a,a^2,a^3,\ldots\right]\right\}=e^{ax}\)。
我们不妨选用 \(\mathbf{EGF}:e^{ax}\)。
考虑 \(\displaystyle\hat{G}(n,x)=\sum_{k=0}^{\infty}\frac{S_{k}(n)}{k!}x^k\),即 \(\mathbf{EGF}\left\{\left[S_0(n),S_1(n),S_2(n),\ldots\right]\right\}\),则有如下式子:
最后的 \(\displaystyle\sum_{i=1}^{n}e^{ix}\) 可以这样化简:
那么 \(S_k(n)\) 等于 \(k![x^k]\hat{G}(n,x)\),也就等于 \(\displaystyle k![x^k]\frac{\displaystyle\sum_{i=0}^{\infty}\frac{n^{i+1}}{(i+1)!}x^i}{\displaystyle\sum_{i=0}^{\infty}\frac{(-1)^{i+1}}{(i+1)!}x^i}\)。
据此可以在 \(\mathcal{O}(m\log m)\) 的时间内,使用多项式求逆和卷积,求出 \(n\) 固定时 \(0\le k<m\) 的所有 \(S_k(n)\)。
我们之前提到了 \(S_k(x)\) 是关于 \(x\) 的 \(k+1\) 次多项式,假设固定了 \(k\) 能否求出此多项式呢?
当然我们无法对 \(1\le k\le m\) 的所有 \(k\) 求出所有多项式的系数了,因为有 \(\mathcal{O}(m^2)\) 个系数。
仍然考察 \(\hat{G}(n,x)\),我们希望的是将其写作一个与 \(n\) 无关的生成函数与一个与 \(n^i\)有关的生成函数的乘积。
考虑 \(e^{nx}=\mathbf{EGF}\left\{\left[1,n,n^2,n^3,\ldots\right]\right\}\),注意到 \(\hat{G}(n,x)\) 的分子就包含此式,顺着思路化简:
则右边:\(\displaystyle\frac{e^{nx}-1}{x}=\mathbf{EGF}\left\{\left[n,\frac{n^2}{2},\frac{n^3}{3},\ldots\right]\right\}\)。
设左边的生成函数对应的级数为 \(B\),即:
我们知道指数型生成函数的乘积对应了其对应级数的二项卷积,我们把式子写成二项卷积的形式:
则得到最终的式子:\(\displaystyle\sum_{i=1}^{n}i^k=\frac{1}{k+1}\sum_{j=0}^{k}\binom{k+1}{j}B_jn^{k-j+1}\)。
其中 \(B\) 就是所称的“伯努利数”:\(\displaystyle\mathbf{EGF}\left\{B\right\}=\frac{xe^x}{e^x-1}\)。
其前 \(15\) 项为:
容易看出除了 \(\displaystyle B_1=\frac{1}{2}\),其它奇数位置的项均为 \(0\)。
考虑如何求出伯努利数。
从生成函数的角度考虑,有:\(\displaystyle B_n=n![x^n]\frac{\displaystyle\sum_{i=0}^{\infty}\frac{1}{i!}x^i}{\displaystyle\sum_{i=0}^{\infty}\frac{1}{(i+1)!}x^i}\)。
这是适宜使用多项式求逆和卷积在 \(\mathcal{O}(n\log n)\) 的时间复杂度内求出前 \(n\) 个伯努利数的方法。
想求伯努利数,不想写多项式,怎么办?
没关系,我们可以通过生成函数反推出递推式,考虑如下式子:
那么以 \(B_0=1\) 为边界,按照递推式 \(\displaystyle B_n=1-\frac{1}{n+1}\sum_{i=0}^{n-1}\binom{n+1}{i}B_i\),
即可依次计算出 \(B_i\) 的值,假设需要处理前 \(m\) 个伯努利数,则复杂度为 \(\mathcal{O}(m^2)\)。
参考资料:
Bernoulli number, Wikipedia。
康复计划#3 简单常用的几种计算自然数幂和的方法, MoebiusMeow。
@_rqy 在 Universal OJ 用户群中的解答。
来源:oschina
链接:https://my.oschina.net/u/4381446/blog/3238177