• 斯特林数&斯特林反演


    第一类斯特林数

    定义

    第一类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} ]

    例题

  • 相关阅读:
    6.基础控件
    5.对话框组合
    4.对话框程序
    3. MFC原理介绍
    三星曲面显示器
    笔记本光驱接口怎么外接台式机硬盘?
    笔记本usb外接3.5寸sata台式机硬盘, 用mhdd检测不到,怎么处理?
    MHDD检测不到硬盘的解决办法
    MHDD检测电脑硬盘坏道
    一个指向指针函数的函数指针
  • 原文地址:https://www.cnblogs.com/Emiya-wjk/p/10015753.html
Copyright © 2020-2023  润新知