binomial sum
去年省选结束机房五个人有四个人颓废一个人卷。后来就只有我一个人摆烂了。
百无聊赖之际学了学 binomial sum,然而一知半解。而且没看懂 EI 原文。
时隔一年多现在哥们高考完了借做数论课件的机会重新学了下这个东西。经过一年 whk 之后才感受到 EI 的强大。
Prean 老师的博客,说实话,第一次看的时候我确实没看懂。回来以后按照上边的程式化方法复习这个点,若有所思,回去看了原文才完全理解。那么借这个机会,重写一遍这篇博客。
首先你得知道微分有限是个什么东西。详见 https://www.cnblogs.com/whx1003/p/13825483.html 。
然后你需要看一遍 EI 的原文 https://www.luogu.com/article/6158040k ,发现看不懂。(看懂了你还来这干吗)
所以我们一句一句来翻译。以一道题为例。
题意略。
首先我们简单转化题意:
于是我们的问题就变成了求这个东西。
回到 EI 原文:
对于微分有限 (D-Finite) 的生成函数 \(F(x)\),又设一生成函数 \(G(x)\),有数列 \(a\),我们已经对每个 \(0\le k\le n\) 知晓了
\[\sum_{j=0}^na_j[x^j]G(x)^k \]那么我们可以在 \(\Theta(n)\) 时间内计算
\[\sum_{j=0}^na_j[x^j]F(G(x)) \]
审查条件:\(F(x)=(x+1)^n,G(x)=e^x\)。
\(a_1,a_2,\dots,a_{k-1}=0,a_k=1\)。
\([x^k]G(x)^i=i^k\)。
成立。于是我们可以放心地进行操作。

这就给出了一个想法:我们找一个 \(F(x+c)\),找到他的所有系数之后代入 \(G(x)-c\),这样他的系数只有前 \(n\) 项是有用的。
于是我们考虑直接截断:设 \(\mathcal F(x+c)=F(x+c)\mod x^{n+1}\)。这样就只保留了其前 \(n\) 项系数。
先考虑推出其所有系数:这里我们需要借助 \(F(x)\) 的微分方程。由于其微分有限,我们总能找到微分方程。
以上题为例,\(F(x)\) 满足 \((x+1)F'(x)-nF(x)=0\)。
\(c=1\),也就是 \((x+2)F'(x+1)-nF(x+1)=0\)。
截断,此时 \((x+2)\mathcal F'(x+1)-n\mathcal F(x+1)\) 并不是 \(0\)。我们知道如果有问题肯定在 \(x^k\) 项这个边界。考察后发现, \(F'(x+1)\) 的求导操作将 \(x^{k+1}\) 项拉下来对 \(x^k\) 项造成贡献(因为有乘常数),但是截断后 \(x^{k+1}\) 项变 \(0\) 了。所以我们补上贡献。简单计算之后得到
但是这时候我们发现你没法代一个 \(e^x-1\) 进函数,只会代 \(e^x\)。所以我们还原回 \(\mathcal F(x)\) 再代 \(G(x)\),就和对 \(\mathcal F(x+c)\) 代 \(G(x)-c\) 效果是一样的。也即
经典的 ODE 递推式。
这时候我们面对一个问题:初始项是哪个?
一个比较笨的方法是把 \(f_0\) 通过某些方式(按照定义)算出来然后从下往上推。
一个比较高明的方式是发现 \(f_{k+1}=0\),然后可以直接倒着推回来。
得到了 \(\mathcal F(x)\) 的各项系数后,即可得到答案
这也就解决了问题。
我们总结一下:先整体偏移一个常数 \(c\),然后列微分方程,截断并列出贡献,最后偏移回去递推系数并进行复合。
练习:贝尔数
解答:\(F(x)=e^{x-1},G(x)=e^x\)。
以下为本文原稿。
前情提要:模拟赛就要出三个大模拟,字面意思上的模拟赛。所以发动了魔法卡献祭了模拟赛来写这个东西。
我刚改邪归正准备好好敲暴力你就给我来这个?建议出题人自己写。
感觉写博逐渐倾向于告诉自己“我学了这个东西但是以后可能会忘所以记下来”这种心态。算了反正模拟赛狗都不打。
一开始看 EI 的原文,看的一知半解。然后看 Prean 老师的洛谷日报,整不会了。然后找了几篇题解,似乎大概知道了这是个什么过程。但是并不明白这个名字是什么意思。
感觉直接上例题来解释这个过程是如何运行的会更好理解一点。
以下所有题默认 \(k\le n\)。
CF932E Team Work
题意:求
首先我们会 \(O(k\log k)\),直接把后边的 \(i^k\) 爆拆斯特林数随便推一下就成。不过这不重要。
我们的技术首先把这个式子变成某个生成函数的 \(k\) 项的形式。
设 \(F(x)=(x+1)^n\),则答案就是 \([x^k]F(e^x)\)。Binomial sum 的方法通过去除函数的常数项达到只需要求得 \(x^{k+1}\) 以内的项即可得到答案的效果。\(e^x\) 的常数项为 \(1\),则我们设
则我们断言答案是 \([x^k]\mathcal F(e^x)\)。证明考虑泰勒展开的 \(k\) 次项以后都是不需要的,详见 EI 原文。
那么我们此时列出 \(F(x)\) 满足的微分方程:
那么将 \(x\) 替换为 \(x+1\),显然有
此时我们将 \(F(x+1)\) 替换为 \(\mathcal F(x+1)\)。然而此时不能随意替换。注意到原本的 \((x+1+1)F'(x+1)\) 由于求导,在 \([x^k]\) 处有 \(x^k,x^{k+1}\) 两项的贡献。而在 \(x^{k+1}\) 处截取之后没有了 \(x^{k+1}\) 项的贡献,所以我们需要把截取后的 \(x^k\) 项手算出来。根据 \(F(x)=(x+1)^n\) 把项拆出来,简单手算一下可以得到:
注意等式右边是 \(F\)。然后带入 \(x\leftarrow x-1\):
右边是个系数所以仍然是 \(F(x+1)\)。
算一下右边:
于是可以递推。具体列递推式:
一个比较笨的方法是把 \(f_0\) 通过某些方式(按照定义)算出来然后从下往上推。
一个比较高明的方式是发现 \(f_{k+1}=0\),然后可以直接倒着推回来。
得到了 \(\mathcal F(x)\) 的各项系数后,即可得到答案
可以 \(O(k)\) 算出。大致就是这样的过程。我们见到的应用多为 \(F(e^x)\) 的形式,但里边的函数其实可以换成别的,详见 EI 原文。
P5907 数列求和加强版 / SPOJ MOON4
另一道例题。首先经过简单转化,答案为
于是设 \(F(x)=\dfrac{1-x^{n+1}}{1-x}\)。求导表示自己得到 ODE(设 \(G(x)=1-x^{n+1}\))
于是
仍设 \(\mathcal F(x+a)=F(x+a)\bmod x^{k+1},\mathcal G(x+a)=G(x+a)\bmod x^{k+1}\),有
算下 \(\mathcal G'(x)\)(这里 \(n\leftarrow n+1\)):
另一边:
考虑计算 \(h_k=\sum_{i=k}^n\dbinom ika^{i-k}\):
首先特判 \(a=1\),上指标求和得到是 \(\dbinom{n+1}{k+1}\)。
可以递推。于是可以递推得到 \(\mathcal F(x)\),答案即为 \(\sum_{i=0}^kf_ia^ii^k\)。
实际上有时候并没有有限微积分的方法简洁,但是它的重要意义是提出了一个通用的方法。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号