在计数问题中我们经常需要对求和的式子进行转化来加速求和。这里略作整理。
基础-组合恒等式
-
i=0∑n(in)=2n
-
i=0∑naibn−i(in)=(a+b)n
二项式定理。
-
(mn)(km)=(kn)(m−kn−k)
当外层枚举的变量仅为 j 时,我们可以利用这个恒等式将 n,k 提出并把求和移到后面。后面的求和通常可以用 (1) 式优化。
-
i=0∑n(in)(k−im)=(kn+m)
当 n,m,k 为常量时这个等式非常方便。
-
(mn)mk=(m−kn−k)nk
组合数也可以实现下降幂的转化。
基础-斯特林公式
-
nm=i=0∑m(im){ni}i!
注意到无论是斯特林数还是组合数当上面的数比下面的数大时均为 0 ,所以枚举的上界可以是 n 也可以是 m 。
-
{ij}=k=0∑j(−1)k+j(kj)ki
拆斯特林数的方法。可以由 (1) 二项式反演得到。
-
xn=i=0∑n{ni}xixn=i=0∑n[ni]xi
斯特林数给我们提供了拆幂次项以及下降幂/上升幂/普通幂之间相互转化的工具。
技巧
-
当枚举的变量 i 到某个值时,也许求和式中的斯特林数/排列组合数/上升下降幂就变为 0 了,常用这点来修改上下边界。
-
任何的 ∑ 符号都是可以互换的(当然,你要确保每一层的上下界不变)。这一点非常重要。
- 可以使本不在一个 ∑ 内的两个数乘到一起,再用恒等式变幻。
- 可以将变量提出来,得到变量前的系数。
- ⋯
-
当枚举的范围 n 特别大 (109) 时,并且式子中的幂次项的幂次范围不大时,可以考虑用斯特林公式。
-
利用斯特林公式可以实现普通幂/下降幂/上升幂多项式之间的转化。以普通幂转下降幂为例
F(x)=i=0∑naixi=i=0∑naij=0∑i{ij}xj=j=0∑nxji=j∑nai{ij}
后面的 ∑ 即为系数
-
注意二项式定理的灵活运用。(a+b)n 中 a,b 可以任意指定。
实战
-
i=1∑n(in)ik(mod109+7)
Hint:1≤n≤109,1≤k≤103
思路: n 范围比较大,但 k 范围比较小,考虑用斯特林公式展开。
i=1∑n(in)j=0∑i{kj}(ji)j!
仔细观察,发现两个组合数很有特点,与 (2) 形式一致。考虑交换求和符号
j=0∑k{kj}j!i=j∑n(in)(ji)=j=0∑k{kj}j!i=j∑n(jn)(i−jn−j)=j=0∑k{kj}j!(jn)i=j∑n(i−jn−j)=j=0∑k{kj}j!(jn)i=0∑n−j(in−j)=j=0∑k{kj}j!(jn)2n−j
做完了。
-
i=0∑nj=0∑i{ij}2jj!
Hint:1≤n≤105
思路:这个式子平平无奇。我们尝试打开斯特林数让式子有趣一点。
i=0∑nj=0∑i2jj!k=0∑j(−1)k+j(kj)ki
发现除了 ki 项以外所有的项都与 i 无关。考虑将 k 提前枚举,再把 j 拆成卷积的形式。
i=0∑nk=0∑nk!kij=k∑i(j−k)!(−1)j−k⋅1j!2j
注意到后面 j 枚举的东西只与 k 有关。不妨设为 ak 。
i=0∑nk=0∑nkik!ak=k=0∑nk!aki=0∑nki=k=0∑nk!ak⋅k−1kn+1−1
ak 是可以用减法卷积求的。所以这个题就做完了。
-
k=0∑nF(k)×xk×(kn)(modp)
其中 F(x)=i=0∑maixi 。
Hint:1≤n,x,p≤109,1≤m≤103
思路:看上去后面的东西与第一道例题很相似,我们尝试打开。
k=0∑nF(k)×(kn)i=0∑k(ix){ki}i!
后面那两个组合数没有一个字母一样,显然不可做了。换个想法。拆普通幂的方法还有第二条斯特林公式。
如果把多项式 F(x) 带入 k ,再放入求和式内,我们会得到
k=0∑ni=0∑maiki×xk×(kn)=k=0∑ni=0∑m(kn)aiki×xk=i=0∑maik=0∑n(kn)kixk
内层的枚举中,各字母特点极似组合数乘下降幂的特点。
根据技巧中的第四条将 F(x) 转变为下降幂多项式 F(x)=i=0∑maixi=i=0∑mbixi ,我们将 xi 带进去试试。
i=0∑mbik=0∑n(kn)kixk=i=0∑mbinik=0∑n(k−in−i)xk=i=0∑mxibinik=0∑n−i(kn−i)xk=i=0∑mxibini(x+1)n−i
利用二项式定理成功将 n 提到了指数上。