首页 > 其他分享 >斯特林数的四种求法

斯特林数的四种求法

时间:2022-09-03 15:55:08浏览次数:53  
标签:begin end 斯特林 sum poly 求法 int over 四种

有一回对我说道,“你读过书么?”我略略点一点头。他说,“读过书,……我便考你一考。组合数学里的斯特林数,怎样说的?”我想,AKIOI的人,我也配答么?便回过脸去,不再理会。田乙己等了许久,很恳切的说道,“不会罢?……我教给你,记着!这些数应该记着。将来做OIer的时候,省选要用。”我暗想我和省选的等级还很远呢,而且我们考纲里也没有斯特林数;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是将n个元素划分成m个集合或环排列的方案数嘛?”田乙己显出极高兴的样子,将两个指头的长指甲敲着鼠标,点头说,“对呀对呀!……斯特林数有四样求法,你知道么?”我愈不耐烦了,努着嘴走远。田乙己刚打开typora,想在电脑上打公式,见我毫不热心,便又叹一口气,显出极惋惜的样子。

第一类斯特林数·行

众所周知:

\[x^{\overline{n}}=\sum_{i=0}^n \begin{bmatrix}n\\ i\end{bmatrix} x^i \]

求上升幂考虑倍增,\(x^{\overline{2n}}=x^{\overline{n}}\cdot (x+n)^{\overline{n}}\)

问题变为已知 \(f(x)\),如何求 \(f(x+c)\),考虑硬带

\[f(x+c)=\sum_{i=0}^n f_i (x+c)^i=\sum_{i=0}^n f_i \sum_{j=0}^i \binom{i}{j}x^j c^{i-j} \]

\[=\sum_{j=0}^n x^j \sum_{i=j}^n f_i \binom{i}{j} c^{i-j} \]

\[=\sum_{j=0}^n {x^j \over j!} \sum_{i=j}^n f_i i! \cdot {c^{i-j}\over (i-j)!} \]

发现后面是减法卷积,reverse一遍做乘法再reverse回来就行,问题解决。

inline poly trans(poly a, int c) {
	poly p;
	for (register int i = 0; i < a.size(); ++i) {
		a[i] = (1ll * a[i] * fac[i]) % mod;
		p.push_back((1ll * power(c, i) * ifac[i]) % mod);
	} int n = a.size(); reverse(a.begin(), a.end()); a = mul(a, p);
	a.resize(n); reverse(a.begin(), a.end());
	for (register int i = 0; i < a.size(); ++i)
		a[i] = (1ll * a[i] * ifac[i]) % mod;
	return a;
}

inline poly stir1R(int n) {
	poly t, y; int k = n, tt = 1;
	t.push_back(1); y.push_back(0); y.push_back(1);
	int sum = 0;
	while (k) {
		if (k & 1) {
			sum += tt;
			t = mul(trans(t, tt), y);
			t.resize(sum + 1);
		} y = mul(trans(y, tt), y);
		tt <<= 1; //y len
		y.resize(tt + 1);
		k >>= 1;
	} return t;
}

第二类斯特林数·行

众所周知:

\[m^n = \sum_{i=0}^n \binom{m}{i}\begin{Bmatrix} n \\i \end{Bmatrix}i! \]

考虑组合意义,\(n\) 个球放入 \(m\) 个盒子的方案数,相当于枚举 \(i\) 个盒子非空,将球划分到 \(i\) 个盒子中,再乘上全排列。

二项式反演:

\[\begin{Bmatrix} n \\m \end{Bmatrix}m!=\sum_{i=0}^m (-1)^{m-i} \binom{m}{i} i^n \]

\[\begin{Bmatrix} n \\m \end{Bmatrix}=\sum_{i=0}^m ({(-1)^i \over i!})\cdot {(m-i)^n \over (m-i)!} \]

做卷积即可。

inline poly stir2R(int n) {
	poly a, b;
	for (int i = 0; i <= n; ++i) {
		a.push_back((1ll * power(i, n) * ifac[i]) % mod);
		b.push_back(ifac[i]); if (i & 1) b[i] = -b[i] + mod;
		if (b[i] >= mod) b[i] -= mod;
	} return mul(a, b);
}

第一类斯特林数·列

考虑 \(k=1\) 时,就是环排列,构造生成函数:

\[S_1(x)=\sum_{i} \begin{bmatrix}n\\ 1\end{bmatrix} {x^i\over i!}=\sum_{i}{x^i\over i} \]

所以:

\[k!S_k(x)=(S_1(x))^k \]

快速幂即可。

inline poly stir1L(int n, int k) {
	poly a; a.resize(n + 1);
	for (int i = 0; i <= n; ++i)
		a[i] = inver[i];
	a = polypow(a, k, k);
	for (int i = 0; i <= n; ++i)
		a[i] = mul(fac[i], mul(a[i], ifac[k]));
	return a;	
}

第二类斯特林数·列

奇妙方法。

考虑将相同的集合换成不同的盒子,答案会多乘以 \(k!\),设此时单个盒子的 EGF 为G,则:

\[G(x)=\sum_{i\ge 1} {x^i \over i!}=e^x-1 \]

所以 \(k\) 个盒子的 EGF 就是 \((e^x-1)^k\)

\[\begin{bmatrix}n\\ k\end{bmatrix}= {n!\over k!}[x^n](e^x-1)^k \]

inline poly stir2L(int n, int k) {
	poly a; a.resize(n + 1);
	for (int i = 1; i <= n; ++i) a[i] = ifac[i];
	a = polypow(a, k, k);
	for (int i = 0; i <= n; ++i)
		a[i] = mul(fac[i], mul(ifac[k], a[i]));
	return a;
}

标签:begin,end,斯特林,sum,poly,求法,int,over,四种
From: https://www.cnblogs.com/wwlwakioi/p/16652822.html

相关文章

  • 稻盛和夫:这四种“法”,是人生最好的修炼
    四本书的出版顺序是:《活法》《干法》《心》《成法》https://baijiahao.baidu.com/s?id=1719812212580896527&wfr=spider&for=pc......
  • Python 的四种共享传参详解
    Python唯一支持的参数传递方式为共享传参(callbysharing),传递参数一共有四种传递方式,分别为:位置参数,默关键字参数和可变参数,其中可变参数分为两种(*args和**kargs)。一、......
  • 【面试题】Vue路由跳转的四种方式用法及区别
    Vue路由跳转的四种方式用法及区别点击打开视频讲解更加详细一、router-link<router-link:to="{name:'home'}"><router-link:to="{path:'/home'}">//name,path都行......
  • Flask 学习-31.flask_jwt_extended 验证token四种方headers/cookies/json/query_stri
    前言用户携带授权token访问时,其jwt的所处位置列表,默认是在请求头部headers中验证。可以通过JWT_TOKEN_LOCATION进行全局配置,设置token是在请求头部,还是cookies,还是json,......
  • 加快软件开发的四种技术
    加快软件开发的四种技术必须加快软件开发过程,以便为产品提供更多的上市时间。想要引领市场的公司必须比竞争对手更快地推出新产品。在软件开发方面,客户和开发团队可能会......
  • Git中的四种状态
    使用gitstatus查看文件的状态信息。未被跟踪(Untrackedfiles)当我们新建Git仓库之后,查看里面文件的状态的时候,会提示里面的文件都是未被跟踪的状态,如下图所示:  这时......
  • js声明数组的四种方式
    js声明数组的四种方式_麦客子的博客-CSDN博客_js声明数组的写法 https://blog.csdn.net/a911711054/article/details/72869324<!DOCTYPEhtml><htmllang="en"><head......
  • 斯特林数
    斯特林数一共分为两类,较第一类来说,第二类斯特林数更加常用,接下来分别介绍他们。第一类斯特林数:定义:用\(s(n,m)\)表示第一类斯特林数,其含义是把\(n\)个数分成\(m\)......
  • 大批量更新数据mysql批量更新的四种方法
    大批量更新数据mysql批量更新的四种方法-风在山路吹-博客园 https://www.cnblogs.com/mslagee/p/6509682.htmlmysql批量更新如果一条条去更新效率是相当的慢,循......
  • Shell的四种启动方式 配置文件加载
    根据是否需要登录可分为:登录式 非登录式根据是否交互可分为:交互式、非交互式二者组合:登录交互式:常用  通过用户名密码登录shell,或者bash--login新启动的shell登......