斯特林数&斯特林反演

第一类斯特林数

定义

第一类Stirling数(s(n,m)),也可记为(egin{bmatrix}n\mend{bmatrix})

第一类Stirling分为无符号第一类Stirling数(s_u(n,m))和带符号第一类Stirling数(s_s(n,m))

他们分别表现为其升阶函数和降阶函数的各项系数,形式如下:

[x^{ndownarrow}=xcdot (x-1)cdot (x-2)cdots (x-n+1)=sum_{k=0}^ns_s(n,k)cdot x^k\ x^{nuparrow}=xcdot (x+1)cdot (x+2)cdots(x+n-1)=sum_{k=0}^ns_u(n,k)cdot x^k ]

无符号Stirling数更为常用,表示将(n)个不同元素构成(m)个圆排列的数目。

有无符号Stirling之间有关系式(s_s(n,m)=(-1)^{n+m}cdot s_u(n,m))

递推式

无符号第一类Stirling数

设元素有编号(1,2,...,n),则将(n)个元素构成(m)个圆有两种情况:

①把第(n)个元素单独作为一个圆,用前(n-1)个元素构成(m-1)个圆,方案数(egin{bmatrix}n-1\m-1end{bmatrix})

②用前(n-1)个元素构成(m)个圆,把第(n)个元素插在前((n-1))个元素任意一个之前,方案数((n-1)cdot egin{bmatrix}n-1\mend{bmatrix})

综上:

[egin{bmatrix}n\mend{bmatrix}=egin{bmatrix}n-1\m-1end{bmatrix}+(n-1)cdot egin{bmatrix}n-1\mend{bmatrix} ]

赋初值(s(0,0)=1)

有符号第一类Stirling数

可以从其表示的降阶函数归纳证明:

[sum_{k=0}^{n}s_s(n,k)cdot x^k=x^{ndownarrow}=x^{(n-1)downarrow}cdot(x-(n-1))=sum_{k=0}^{n-1}s_s(n-1,k)cdot x^{k+1}-(n-1)cdotsum_{k=0}^{n-1}s_s(n-1,k)cdot x^k ]

依次把(x^m)的左右两边的系数提取出来得:

[s_s(n,m)=s_s(n-1,m-1)-ncdot s_s(n-1,m-1) ]

用分治+NTT求第一类Stirling数

以求无符号第一类Stirling数为例:

因为可以表示为升阶函数的各项系数,即:

[x^{nuparrow}=xcdot (x+1)cdot (x+2)cdots(x+n-1)=sum_{k=0}^ns_u(n,k)cdot x^k ]

我们可以用分治的思想,每次处理一半的多项式来NTT,时间复杂度(O(nlog^2n))

代码实现

int rev[N];
void NTT(int *a,int x,int K){
	int n=(1<<x);
	for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int i=1;i<n;i<<=1){
		int tmp=i<<1,wn=ksm(3,(mod-1)/tmp);
		if(K==-1)wn=ksm(wn,mod-2); 
		for(int j=0;j<n;j+=tmp){
			int w=1;
			for(int k=0;k<i;k++,w=(LL)w*wn%mod){
				int x=a[j+k],y=(LL)w*a[i+j+k]%mod;
				a[j+k]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;
			}
		}
	}
	if(K==-1){
		int inv=ksm(n,mod-2);
		for(int i=0;i<n;i++)a[i]=(LL)a[i]*inv%mod;
	}
}
void Binary(int *a,int l,int r){
	if(l==r)return a[0]=l,a[1]=1,void();//有符号赋值a[0]=-l;
	int mid=l+r>>1;
	int f[N],g[N];
	memset(f,0,(r-l+1)<<3),memset(g,0,(r-l+1)<<3); 
	Binary(f,l,mid),Binary(g,mid+1,r);
	int x=ceil(log2(r-l+2));
	for(int i=0;i<(1<<x);i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<x-1);
	
	NTT(f,x,1),NTT(g,x,1);
	for(int i=0;i<(1<<x);i++)a[i]=(LL)f[i]*g[i]%mod;
	NTT(a,x,-1);
}

例题

Codeforces 960G Bandit Blues

第二类斯特林数

定义

第二类Stirling数记为(S(n,m))或者(egin{Bmatrix}n\mend{Bmatrix})

第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数。

常常用于解决组合数学中几类放球模型;

描述为:将n个不同的球放入m个无差别的盒子中,要求盒子非空,有几种方案?

由容斥原理可以得到其通项公式:

[egin{Bmatrix}n\mend{Bmatrix}=frac 1 {m!}sum_{i=0}^m(-1)^iinom mi(m-i)^n ]

递推式

设元素有编号(1,2,...,n),则将(n)个元素构成(m)个集合有两种情况:

①把第(n)个元素单独作为一个集合,用前(n-1)个元素构成(m-1)个集合,方案数(egin{Bmatrix}n-1\m-1end{Bmatrix})

②用前(n-1)个元素构成(m)个集合,把第(n)个元素插入任意一个集合之中,方案数(mcdot egin{Bmatrix}n-1\mend{Bmatrix})

综上:

[egin{Bmatrix}n\mend{Bmatrix}=egin{Bmatrix}n-1\m-1end{Bmatrix}+mcdot egin{Bmatrix}n-1\mend{Bmatrix} ]

赋初值:(S(0,0)=1)


两类Stirling数之间的关系

[sum_{i=0}^nS(n,i)s(i,m)=sum_{i=0}^ns(n,i)S(i,m) ]

推论&总结

对原式二项式反演可得

[m^n=sum_{i=0}^minom miegin{Bmatrix}n\iend{Bmatrix}i!=sum_{i=0}^megin{Bmatrix}n\iend{Bmatrix}m^{idownarrow} ]

等价于

[m^n=sum_{i=0}^ninom miegin{Bmatrix}n\iend{Bmatrix}i!=sum_{i=0}^negin{Bmatrix}n\iend{Bmatrix}m^{idownarrow} ]

可以用于计算其他式子。

比如:

[egin{split} &sum_{i=0}^ni^k=sum_{i=0}^kegin{Bmatrix}k\iend{Bmatrix}i!inom{n+1}{i+1}\ &sum_{i=1}^ni^kinom ni=sum_{i=0}^kegin{Bmatrix}k\iend{Bmatrix}i!inom ni2^{n-i} end{split} ]

例题

【TJOI2018】教科书般的亵渎

Codeforces 932E Team Work


将通项公式再化一下:

[egin{Bmatrix}n\mend{Bmatrix}=sum_{i=0}^mfrac{(-1)^i}{i!}cdotfrac{(m-i)^n}{(m-i)!} ]

这是一个形如(sum_{i=0}^mf(i)*g(m-i))的卷积的形式,可以用FFT快速计算。

第一个多项式的第(i)项系数为(frac {(-1)^i}{i!});第二个多项式的第(i)项系数为(frac {i^n}{i!})

两式相乘,第(i)项的系数即为(S(n,i))

例题

【BZOJ5093】图的价值

其他题目

【TJOI/HEOI2016】求和

斯特林反演

[displaystyle f(n)=sum_{k=0}^n egin{Bmatrix}n\k end{Bmatrix}g(k) iff g(n)=sum_{k=0}^n(-1)^{n-k}egin {bmatrix} n\k end{bmatrix}f(k) ]

证明斯特林反演

首先,我们需要考虑如何建立上升阶乘幂与下降阶乘幂之间的关系。

结论:

[x^{ndownarrow}=(-1)^n(-x)^{nuparrow}\ x^{nuparrow}=(-1)^n(-x)^{ndownarrow} ]

证明:

[egin{split} (-1)^n(-x)^{nuparrow}&=(-1)^n(-x)(-x+1)cdots(-x+n-1)\ &=(-1)^n(-x)(-(x-1))cdots(-(x-n+1))\ &=x(x-1)cdots(x-n+1)\ &=x^{ndownarrow} end{split} ]

同理可证(x^{nuparrow}=(-1)^n(-x)^{ndownarrow})


接下来,我们需要证一个叫反转公式的东西:

还是先给出结论:

[sum_{i=m}^n(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}egin{Bmatrix}i\mend{Bmatrix}=[m=n]\ sum_{i=m}^n(-1)^{n-i}egin{Bmatrix}n\iend{Bmatrix}egin{bmatrix}i\mend{bmatrix}=[m=n] ]

证明:

[egin{split} n^m&=sum_{i=0}^megin{Bmatrix}m\iend{Bmatrix}n^{idownarrow}\ &=sum_{i=0}^megin{Bmatrix}m\iend{Bmatrix}(-1)^i(-n)^{iuparrow} end{split} ]

(x^{nuparrow}=sumlimits_{k=0}^ns_u(n,k)cdot x^k​)带入:

[egin{split} n^m&=sum_{i=0}^megin{Bmatrix}m\iend{Bmatrix}(-1)^isum_{j=0}^iegin{bmatrix}i\jend{bmatrix}(-n)^j\ &=sum_{j=0}^mn^jsum_{i=j}^megin{Bmatrix}m\iend{Bmatrix}egin{bmatrix}i\jend{bmatrix}(-1)^{i-j} end{split} ]

即:

[sum_{i=j}^megin{Bmatrix}m\iend{Bmatrix}egin{bmatrix}i\jend{bmatrix}(-1)^{i-j}=[j=m] ]

这个与上面的式2等价,于是我们就证出了其中一个反转公式。

[egin{split} m^{ndownarrow}&=sum_{i=0}^n(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}m^i\ &=sum_{i=0}^n(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}sum_{j=0}^iegin{Bmatrix}i\jend{Bmatrix}m^{jdownarrow}\ &=sum_{j=0}^nm^{jdownarrow}sum_{i=j}^n(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}egin{Bmatrix}i\jend{Bmatrix} end{split} ]

即:

[sum_{i=j}^n(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}egin{Bmatrix}i\jend{Bmatrix}=[j=n] ]

由此证出了式1。


然后,我们就可以证明斯特林反演了:

若满足(g(n)=sumlimits_{j=0}^n(-1)^{n-j}egin{bmatrix}n\jend{bmatrix}f(j)),则

[egin{split} f(n)&=sum_{j=0}^n[j=n]f(j)\ &=sum_{j=0}^nsum_{k=j}^negin{Bmatrix}n\kend{Bmatrix}egin{bmatrix}k\jend{bmatrix}(-1)^{k-j}f(j)\ &=sum_{k=0}^negin{Bmatrix}n\kend{Bmatrix}sum_{j=0}^k(-1)^{k-j}egin{bmatrix}k\jend{bmatrix}f(j)\ &=sum_{k=0}^negin{Bmatrix}n\kend{Bmatrix}g(k) end{split} ]

例题

原文地址:https://www.cnblogs.com/Emiya-wjk/p/10015753.html