第一二类斯特林数学习笔记

本篇文章主要介绍斯特林数的一些推导和性质。

应用的话,不会。

前置芝士

(1) 上升幂和下降幂

上升幂:\(x^{\overline n} = x\times (x+1) \times (x+2).....\times (x+n-1)\)

下降幂:\(x^{\underline n} = x\times (x-1)\times (x-2).....\times (x-n+1)\)

(2) 二项式反演

\(f(n) = \displaystyle\sum_{i=0}^{n} (-1)^i {{n}\choose {i}}g(i) \Rightarrow g(n) = \displaystyle\sum_{i=0}^{n}(-1)^i {n\choose i}f(i)\)

或者 \(f(n) = \displaystyle\sum_{i=0}^{n}{n\choose i}g(i) \Rightarrow g(n) = \displaystyle\sum_{i=0}^{n} (-1)^{n-i}{n\choose i} f(i)\)

(3) 组合数的一些柿子

主要是第二类斯特林数推导过程会用到一些柿子。

\(\displaystyle\sum_{i=0}^{n} {i\choose m} = {n+1\choose m+1}\)

因为 \(n<m\) 的时候 \({n\choose m} = 0\), 所以我们的柿子可以写成:\(\displaystyle\sum_{i=m}^{n} {i\choose m}\)

即:\({m\choose m} + {m+1\choose m} + {m+2\choose m}....+{n\choose m}\)

又因为:\({m\choose m} = 1 = {m+1\choose m+1}\),所以 \(m+1\choose m+1\) 可以和 \({m+1\choose m}\) 合并,变为:\(m+2\choose m+1\)

然后有:\({m+2\choose m+1} + {m+2\choose m} ={m+3\choose m+1}\), \({m+3\choose m+1} + {m+3\choose m} = {m+4\choose m+1}\)

一直合并下去就可以得到 \({n+1\choose m+1}\)

由此可得: \(\displaystyle\sum_{i=0}^{n} {i\choose m} = {n+1\choose m+1}\)

第一类斯特林数

第一类斯特林数 \(s(n,m)\) ,记做 \(\begin{bmatrix}n\\m \end{bmatrix}\)

定义: 将 \(n\) 个不同的元素分成 \(m\) 个环的方案数 (环可以旋转,旋转后算一个环)。

递推式\(\begin{bmatrix}n\\m\end{bmatrix} = \begin{bmatrix}n-1\\m-1\end{bmatrix} +(n-1)\times \begin{bmatrix} n-1\\m\end{bmatrix}\)

其中 \(\begin{bmatrix}0\\0\end{bmatrix} = 1, \begin{bmatrix} i\\0\end{bmatrix} = 0 \left(i \ge 1\right)\)

证明如下:考虑新加入的第 \(n\) 的元素,如果他新开一个环的话,那么剩下的 \(n-1\) 个元素就要放到 \(m-1\) 个环中,方案数为 \(\begin{bmatrix}n-1\\m-1\end{bmatrix}\), 如果他要和某一个元素放在一个环,剩下的 \(n-1\) 个元素就要放到 \(m\) 个环中,且第 \(n\) 个元素可以放到剩下的 \(n-1\) 个元素的左边或右边,共有 \(n-1\) 个选择,所以方案数为 \((n-1)\times \begin{bmatrix}n-1\\m\end{bmatrix}\)

性质1\(\displaystyle\sum_{i=0}^{n} \begin{bmatrix}n\\i\end{bmatrix} = n!\)

我们从置换的角度来入手证明这个柿子,一个置换会有若干的循环节, \(i\) 个循环节的置换总量为 \(\begin{bmatrix}n\\i\end{bmatrix}\), 所以加起来就不重不漏的统计了所有的置换,总数为 \(n!\)

性质2\(x^{\overline n} = \displaystyle\sum_{i=0}^{n} \begin{bmatrix}n\\i\end{bmatrix} x^i\)

考虑用归纳法证明这个柿子。

\(x^{\overline {n+1}} = (x+n)\times x^{\overline n}\)

\(= (x+n)\times \displaystyle\sum_{i=0}^{n}\begin{bmatrix}n\\i\end{bmatrix} x^i\)

\(= x\times \displaystyle\sum_{i=0}^{n} \begin{bmatrix}n\\i\end{bmatrix} x^i + n\times \displaystyle\sum_{i=0}^{n}\begin{bmatrix}n\\i\end{bmatrix} x^i\)

\(=\displaystyle\sum_{i=0}^{n} \begin{bmatrix} n\\i\end{bmatrix}x^{i+1} + n\times \displaystyle\sum_{i=0}^{n} \begin{bmatrix}n\\i\end{bmatrix} x^i\)

\(= \displaystyle\sum_{i=1}^{n+1} \begin{bmatrix}n\\i-1\end{bmatrix}x^i + \displaystyle\sum_{i=0}^{n} n\times \begin{bmatrix}n\\i\end{bmatrix} x^i\)

\(= \displaystyle\sum_{i=1}^{n}\left(\begin{bmatrix} n\\i-1\end{bmatrix} + n\times \begin{bmatrix}n\\i\end{bmatrix}\right) x^i+ \begin{bmatrix}n\\n\end{bmatrix}x^{n+1} + n\times \begin{bmatrix} n\\0\end{bmatrix} x^0\)

后面的两个散项看起来不太好看,我们想办法把他们凑成和前面的 \(sigma\) 中一样的形式。

因为 \(\begin{bmatrix} n\\n+1\end{bmatrix} = 0,\begin{bmatrix}n\\-1\end{bmatrix} = 0\) 所以我们把这两项带进去不会产生影响,即:

\(x^{\overline{n+1}} = \left(\displaystyle\sum_{i=1}^{n } \begin{bmatrix} n\\i-1\end{bmatrix} + n\times \begin{bmatrix}n\\i\end{bmatrix}\right) x^i + \left(\begin{bmatrix}{n}\\{n}\end{bmatrix} + n\times \begin{bmatrix} n\\n+1\end{bmatrix}\right)x^{n+1} + \left(\begin{bmatrix}n\\-1\end{bmatrix} + n\times \begin{bmatrix}n\\0\end{bmatrix} \right)x^0\)

整理一下可以变成:

\(x^{\overline{n+1}} = \displaystyle\sum_{i=0}^{n+1} \left(\begin{bmatrix}n\\i-1\end{bmatrix}+n\times \begin{bmatrix}n\\i\end{bmatrix}\right) x^i\)

你会发现 \(x^i\) 的系数正好是第一类斯特林数的递推公式,所以:

\(x^{\overline{n+1}} = \displaystyle\sum_{i=0}^{n+1} \begin{bmatrix}n+1\\i\end{bmatrix}x^i\)

然后也就是我们性质2的柿子。

性质3: \(x^{\underline n} = \displaystyle\sum_{i=0}^{n} (-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix} x^i\)

这个好像可以用二项式反演来证明,但是我不会,这里讲一个比较笨的方法。

\(x^{\underline n} = (-1)^n (-x)^{\overline n} = (-1)^{n} \displaystyle\sum_{i=0}^{n}\begin{bmatrix} n\\i\end{bmatrix}(-x)^i = \displaystyle\sum_{i=0}^{n}(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}x^i\)

第一类斯特林数.行

咕咕咕

第一类斯特林数.列

没学呢,咕咕咕。

第二类斯特林数

第二类斯特林数 \(s(n,m)\) 记做 \(\begin{Bmatrix}n\\m\end{Bmatrix}\)

定义:把 \(n\) 个不同的元素,放到 \(m\) 个相同的集合,每个集合不能为空的方案数。

递推式\(\begin{Bmatrix}n\\m\end{Bmatrix} = \begin{Bmatrix}n-1\\m-1\end{Bmatrix} + m\times \begin{Bmatrix}n-1\\m\end{Bmatrix}\)

其中 \(\begin{Bmatrix}0\\0\end{Bmatrix} = 1, \begin{Bmatrix}i\\0\end{Bmatrix} = 0,(i\ge 1)\)

性质1\(m^n = \displaystyle\sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix} \times i!\times {m\choose i} = \displaystyle\sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\)

ps:这里的求和上标既可以是 \(n\) 也可以是 \(m\), 因为当 \(n>m\) 的时候,\({m\choose i} = 0 (i> m)\), 当 \(n<m\) 的时候,\(\begin{Bmatrix} n\\i\end{Bmatrix} = 0 (i>n)\)

这个我们考虑用组合意义来证明。

首先 \(m^n\) 表示 \(n\) 个物品放入\(m\) 个不同的盒子中,每个盒子可以为空的情况数。

我们考虑枚举有多少个非空盒子,首先要从 \(m\) 个盒子中选出 \(i\) 个方案数为 \(m\choose i\) ,然后这个 \(n\)

个物品要放到 \(i\) 个盒子中,方案数为 \(\begin{Bmatrix}n\\i\end{Bmatrix}\),又因为每个盒子不同,所以还要乘上 \(i!\)

因此 \(m^n = \displaystyle\sum_{i=0}^{n}\begin{Bmatrix}n\\i\end{Bmatrix}\times i!\times {m\choose i}\)

我们把组合数拆开可得:

\(m^n = \displaystyle\sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix}\times i!\times {m!\over i!\times (m-i)!}\)

\(=\displaystyle\sum_{i=0}^{n}\begin{Bmatrix}n\\i\end{Bmatrix} {m!\over (m-i)!}\)

\(=\displaystyle\sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\)

性质1的最右边的那个柿子也推出来了。

性质2: \(\displaystyle\sum_{i=0}^{n} i^k = \displaystyle\sum_{i=0}^{k} \begin{Bmatrix}k\\i\end{Bmatrix}\times i!\times {n+1\choose i+1}\)

\(\displaystyle\sum_{i=0}^{n}i^k = \displaystyle\sum_{i=0}^{n}\sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}\times j!\times {i\choose j}\)

交换一下求和顺序则有:

\(\displaystyle\sum_{i=0}^{n}i^k = \displaystyle\sum_{i=0}^{k} \begin{Bmatrix}k\\i\end{Bmatrix}\times i! \sum_{j=0}^{n} {j\choose i}\)

根据前置芝士三里面的柿子可得:

\(\displaystyle\sum_{i=0}^{n}i^k = \displaystyle\sum_{i=0}^{k}\begin{Bmatrix}k\\i\end{Bmatrix}\times i!\times {n+1\choose i+1}\)

我们性质2的柿子就出来了。

性质3\(m^n = \displaystyle\sum_{i=0}^{m}(-1)^{n-i}\times \begin{Bmatrix}n\\i\end{Bmatrix}\times m^{\overline i}\)

这个自己推一下吧。

第二类斯特林数.行

给你一个 \(n\), 让你求 \(\begin{Bmatrix}n\\i\end{Bmatrix} (0\leq i\leq n)\) 的具体值。

首先我们有 \(m^n = \displaystyle\sum_{i=0}^{m}\begin{Bmatrix}n\\i\end{Bmatrix}\times i!\times {m\choose i}\)

\(f(i) = i^n\), \(g(i) = \begin{Bmatrix} n\\i\end{Bmatrix}\times i!\)

然后就有:\(f(m) = \displaystyle\sum_{i=0}^{m}{m\choose i}\times g(i)\)

然后根据二项式反演可得:\(g(m) = \displaystyle\sum_{i=0}^{m}(-1)^{m-i}\times {m\choose i}\times f(i)\)

即:\(\begin{Bmatrix}n\\m\end{Bmatrix}\times m! = \displaystyle\sum_{i=0}^{m}(-1)^{m-i}\times {m\choose i}\times i^n\)

所以: \(\begin{Bmatrix}n\\m\end{Bmatrix} = \displaystyle\sum_{i=0}^{m}(-1)^{m-i}\times {1\over {m!}} \times {m\choose i}\times i^n\)

我们把组合数拆开来构成卷积则有:

\(\begin{Bmatrix}n\\m\end{Bmatrix} = \displaystyle\sum_{i=0}^{m}(-1)^{m-i}\times {1\over {m!}} \times{m!\over i!\times (m-i)!}\times i^n\)

\(\begin{Bmatrix}n\\m\end{Bmatrix} = \displaystyle\sum_{i=0}^{m}(-1)^{m-i} \times{1\over i!\times (m-i)!}\times i^n\)

\(\begin{Bmatrix}n\\m\end{Bmatrix} = \displaystyle\sum_{i=0}^{m}{i^n\over i!} \times {(-1)^{m-i}\over (m-i)!}\)

然后我们构造两个多项式 \(A(x),B(x), C(x)\)

其中 \(A(x) = \displaystyle\sum_{i=0}^{n} {i^n\over i!}x^i\), \(B(x) = \displaystyle\sum_{i=0}^{n} {-1^i\over i!}x^i\), \(C(x) = \displaystyle\sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix} x^i\)

显然有:\(C(x) = A(x)*B(x)\) ,直接 \(NTT\) 即可。

计算出 \(C(x)\) 之后, \(\begin{Bmatrix}n\\m\end{Bmatrix} = [x^m]C(x)\)

洛谷板子题代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
const int p = 167772161;
const int N = 1e6+10;
int n,lim,tim,rev[N],jz[N],inv[N],base[N],a[N],b[N];
inline int read()
{
	int s = 0,w = 1; char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
	return s * w;
}
int ksm(int a,int b)
{
	int res = 1;
	for(; b; b >>= 1)
	{
		if(b & 1) res = res * a % p;
		a = a * a % p;
	}
	return res;
}
void NTT(int *a,int lim,int opt)
{
	for(int i = 0; i < lim; i++)
	{
		if(i < rev[i]) swap(a[i],a[rev[i]]);
	}
	for(int h = 1; h < lim; h <<= 1)
	{
		int wn = ksm(3,(p-1)/(h<<1));
		if(opt == -1) wn = ksm(wn,p-2);
		for(int j = 0; j < lim; j += (h<<1))
		{
			int w = 1;
			for(int k = 0; k < h; k++)
			{
				int u = a[j + k];
				int v = w * a[j + h + k] % p;
				a[j + k] = (u + v) % p;
				a[j + h + k] = (u - v + p) % p;
				w = w * wn % p;
			}
		}
 	}
	if(opt == -1)
	{
		int Inv = ksm(lim,p-2);
		for(int i = 0; i < lim; i++) a[i] = a[i] * Inv % p;
	}
}
signed main()
{
	n = read();
	jz[0] = 1;
	for(int i = 1; i <= n; i++) jz[i] = jz[i-1] * i % p;
	inv[n] = ksm(jz[n],p-2);
	for(int i = n-1; i >= 0; i--) inv[i] = inv[i+1] * (i+1) % p;
	for(int i = 1; i <= n; i++) base[i] = ksm(i,n);
	for(int i = 0; i <= n; i++) a[i] = base[i] * inv[i] % p;
	for(int i = 0, tmp = 1; i <= n; i++, tmp *= -1) b[i] = (tmp * inv[i] % p + p) % p;
	lim = 1, tim = 0;
	while(lim <= (n<<1)) lim <<= 1, tim++;
	for(int i = 0; i < lim; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(tim-1));
	NTT(a,lim,1); NTT(b,lim,1);
	for(int i = 0; i < lim; i++) a[i] = a[i] * b[i] % p;
	NTT(a,lim,-1);
	for(int i = 0; i <= n; i++) printf("%lld ",a[i]);
	printf("\n");
	return 0;
} 

第二类斯特林数.列

没写呢,咕咕咕。

普通幂,上升幂和下降幂之间的转换

其实就是把前面的几个柿子总结了一下。

  • \(x^{\overline n} = \displaystyle\sum_{i=0}^{n}\begin{bmatrix}n\\i\end{bmatrix}x^i\)

  • \(x^{\underline n} = \displaystyle\sum_{i=0}^{n} (-1)^{n-i} \begin{bmatrix}n\\i\end{bmatrix}x^i\)

  • \(x^n = \displaystyle\sum_{i=0}^{n}\begin{Bmatrix}n\\i\end{Bmatrix}\times x^{\underline i}\)

  • \(x^n = \displaystyle\sum_{i=0}^{n}(-1)^{n-i}\begin{Bmatrix}n\\i\end{Bmatrix}x^{\overline i}\)

把这几个柿子记住就好了。

幂的大小顺序:\(x^{\overline n} >x^n > x^{\underline n}\), 大幂转化为小幂的时候要乘上 \(-1^{n-i}\)

posted @ 2021-03-08 08:52  genshy  阅读(249)  评论(1编辑  收藏  举报