第一类斯特林数
定义
第一类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}
]
例题