斯特林反演
斯特林反演
公式:
- 前缀和型
\[g(n) = \sum^n_{k=0} {n \brace k} f(k)\\
\Downarrow\\
f(n) = \sum^n_{k=0} (-1)^{n-k} {n \brack k} g(k)
\]
- 后缀和型
\[f(k) = \sum^n_{i=k} {i \brace k} g(i)\\
\Downarrow\\
g(k) = \sum^n_{i=k} (-1)^{i-k} {i \brack k} f(i)
\]
证明(后缀和型):
组合意义
-
\(g(i)\) 表示恰好将元素划分为 \(i\) 个非空、有标号组的方案数。
-
\(f(k)\) 表示先把元素任意划分,再将组合并成 \(k\) 个有标号大类的方案数。
于是这个正变换,就可以理解为 \(g(i)\) 是把元素缩成了 \(i\) 个小球,\(f(i)\) 是再分入 \(k\) 个盒子,因此每个 \(g(i)\) 的贡献就是 \(n \brace k\) 啦。
补充知识:
正交恒等式
\[\sum^n_{k=m} (-1)^{n-k} {n \brack k} {k \brace m} = [n=m]
\]
证明:
我们有:
\[(x)_n = \sum_{k=0}^{n} (-1)^{n-k} {n \brack k} x^k\\
x^k = \sum_{m=0}^{k} {k \brace m} (x)_m
\]
将后者代入前者,得:
\[(x)_n = \sum_{k=0}^{n} (-1)^{n-k} {n \brack k} \sum_{m=0}^{k} {k \brace m} (x)_m
\]
套路的,我们交换求和顺序:
\[(x)_n = \sum_{m=0}^{n} \red{\sum_{k=m}^{n} (-1)^{n-k} {n \brack k} {k \brace m}} (x)_m
\]
红色部分是 \((x)_m\) 的系数。
由于 \((x)_n = 1 \times (x)_n + 0 \times (x)_m\)(可以把 \((x)_{1 \sim n}\) 理解为线性空间的一组基底),故原式得证。
接下来,我们可以使用代数推导证明斯特林反演。
将正变换代入逆变换,得:
\[ \sum_{i=k}^{n} (-1)^{i-k} {i \brack k} f(i) = \sum_{i=k}^{n} (-1)^{i-k} {i \brack k} \sum_{j=i}^{n} {j \brace i}g(j)
\]
依旧交换求和顺序:
\[ \sum_{j=k}^{n} g(j) \red{\sum_{i=k}^{j} (-1)^{i-k} {i \brack k} {j \brace i} }
\]
应用正交性处理红色部分:
\[ \sum_{j=k}^{n} g(j) \cdot [j = k] = g(k)
\]
得证。
例题选讲
- P10591 BZOJ4671 异或图(线性方程组求解 \(f(i)\))
牛大了。
最终的异或图可以看作是 \(n\) 个点的一个划分,这不禁让我们往斯特林反演上面思考。
由于有异或,可以考虑构建线性方程组。但是怎么构建呢?我们尝试将其与图论扯上关系。稍加观察可以发现,一条边存在于异或图中的次数(\(0\) 或 \(1\))是它在 \(s\) 张图中出现次数的异或和。这样,我们便可以将每条边看作一个未知数来构建线性方程组。于是,设其中自由元的个数为 \(x\),则 \(f(i)=2^x\)。
还有个问题,未知数有了,那方程的右边如何确定呢?观察到数据范围很小,考虑 dfs 枚举最终异或图的联通情况,这样就能用线性基求解自由元个数啦。
补充:这里用到了一个恒等式,详见此处,这个东西可以直接抵消第二类斯特数的系数,从而简化计算。
浙公网安备 33010602011771号