第一类斯特林数

S(n,k)表示第一类斯特林数 n个不同的数字形成k个圆排列的方案数。

s(n,k)表示第二类斯特林数 n个不同的数字形成k个集合的方案数。

S(n,k)=S(n1,k1)+(n1)S(n1,k)

边界S(n,0)=[n==0],S(0,n)=[n==0]

问题模型1

S(n,i) n300000

考虑利用生成函数解决这个问题。

考虑第一类斯特林数的生成函数表示F(x)=Πi=0n1(x+i)=xn¯

具体意义和定义递推式一样。容易想到xk的系数即为S(n,k)

那么问题转化为求F(x)即求xn¯

n&1==1,则xn¯=xn1¯(x+n1)只需求xn1¯即可

n&1==0,则设m=n2,xn¯=x2m¯=xm¯(x+m)m¯

考虑设g(x)=xm¯=i=0maixi

(x+m)m¯=g(x+m)=i=0mai(x+m)i=i=0maij=0iC(i,j)xjmij

颠倒求和一下g(x+m)=j=0mi=jmi!j!(ij)!xjmijai=j=0mxjj!i=jmaiimij(ij)!

这个式子是一个卷积具体做法:将ij取负+m进而和i进行卷积最后j+m上的值即为j的值。

之后将g(x),g(x+m)卷积即可得到xn¯

不断递归下去复杂度为nlogn

code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define putl_(x) printf("%lld ",x);
#define get(x) x=read()
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(int i=p;i<=n;i+=1)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define mk make_pair
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define sq sqrt
#define x(w) t[w].x
#define r(w) t[w].r
#define id(w) t[w].id
#define R(w) s[w].r
#define yy p<<1|1
#define zz p<<1
#define sum(w) t[w].sum
#define mod 167772161
#define sc(A) scanf("%d",&A)
#define scs(A) scanf("%s",A);
#define put(A) printf("%d\n",A)
#define min(x,y) (x>=y?y:x)
#define max(x,y) (x>=y?x:y)
#define sub(x,y) (x-y<0?x-y+mod:x-y)
using namespace std;
const int MAXN=(1<<19)+1,G=3;
int n,k,m,T,cnt,lim;
int fac[MAXN],inv[MAXN],a[MAXN],b[MAXN],w[MAXN],f[MAXN],rev[MAXN],g[MAXN];
inline int ksm(int b,int p)
{
	int cnt=1;
	while(p)
	{
		if(p&1)cnt=(ll)cnt*b%mod;
		b=(ll)b*b%mod;p=p>>1;
	}
	return cnt;
}
inline int C(int n,int m){return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;}
inline void NTT(int *a,int op)
{
	rep(0,lim-1,i)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int len=2;len<=lim;len=len<<1)
	{
		int mid=len>>1;
		int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
		for(int j=0;j<lim;j+=len)
		{
			ll d=1;
			for(int i=0;i<mid;++i)
			{
				ll x=a[i+j],y=a[i+j+mid]*d%mod;
				a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
				d=d*wn%mod;
			}
		}
	}
	if(op==-1)
	{
		int IN=ksm(lim,mod-2);
		rep(0,lim-1,i)a[i]=(ll)a[i]*IN%mod;
	}
}
inline void CDQ(int n)
{
	if(n==1)
	{
		f[0]=0;f[1]=1;
		return;
	}
	if(n&1)
	{
		CDQ(n-1);
		fep(n,0,i)f[i]=(i==0?0:f[i-1]+(ll)(n-1)*f[i])%mod;
	}
	else
	{
		CDQ(n>>1);
		int m=n>>1;
		int ww=1;
		fep(m,0,i)
		{
			b[i]=(ll)ww*inv[m-i]%mod;
			ww=(ll)ww*m%mod;
		}
		rep(0,m,i)a[i]=(ll)f[i]*fac[i]%mod;
		lim=1;while(lim<=m+m)lim=lim<<1;
		rep(0,lim-1,i)rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
		NTT(a,1);NTT(b,1);
		rep(0,lim-1,i)a[i]=(ll)a[i]*b[i]%mod;
		NTT(a,-1);
		rep(0,m,i)g[i]=(ll)a[i+m]*inv[i]%mod;
		NTT(f,1);NTT(g,1);
		rep(0,lim-1,i)f[i]=(ll)f[i]*g[i]%mod;
		NTT(f,-1);
		rep(0,lim-1,i)
		{
			a[i]=b[i]=g[i]=0;
			if(i>m+m)f[i]=0;
		}
	}
}
signed main()
{
	freopen("1.in","r",stdin);
	sc(n);
	fac[0]=1;
	rep(1,n,i)fac[i]=(ll)fac[i-1]*i%mod;
	inv[n]=ksm(fac[n],mod-2);
	for(int i=n-1;i>=0;--i)inv[i]=(ll)inv[i+1]*(i+1)%mod;
	CDQ(n);
	rep(0,n,i)put_(f[i]);
	return 0;
}

第一类斯特林数有几条性质:

1.n!=k=0nS(n,k)

考虑n!的每一个排列他们都是由若干个置换构成这恰一一对应

2.S(n,1)=(n1)!
3.S(n,2)=(n1)!i=1n11i
考虑枚举1所在的环的大小 则方案数为j=0n2C(n1,j)j!(n1j1)!化简得S(n,2)=(n1)!i=1n11i

posted @   chdy  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
历史上的今天:
2020-06-15 luogu P4590 [TJOI2018]游园会 dp套dp
2020-06-15 6.15 省选模拟赛 复活石 狄利克雷卷积 快速幂 数论
2020-06-15 UOJ #310 黎明前的巧克力 FWT dp
2020-06-15 6.15 省选模拟赛 老魔杖 博弈论 SG函数
2020-06-15 luogu P4887 模板 莫队二次离线 莫队 离线
点击右上角即可分享
微信分享提示