《洛谷深入浅出》斯特林数

2023-12-13 06:12

本文主要是介绍《洛谷深入浅出》斯特林数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

斯特林数被分为三种,但我们这只介绍两种。即第一类斯特林数,和第二类斯特拉数。

第一类斯特林数指的是:

将n个不同元素,变成m个圆排列的方案数量。第一类斯特林数,分为有符号和无符号。通常我们只研究无符号斯特林数:s_{s}(n,m)

1,递推求第一类斯特林数:

我们用dp的思路来研究第n个元素,对于第n个元素而言,要变成m个圆排列,有两种情况。

第一种:第n个元素自己成为一个圆排列,那么也就是前n-1个元素组成m-1个圆排列。

方案数为:s_{s}(n-1,m-1)

第二种情况:第n个元素没有新开一个圆排列,而是加入了前面的数的圆排列。也就是前面n-1个数字,构成了m个圆排列。s_{s}(n-1,m).

又由于,对于任意一个圆排列而言,一个数插入进去,有多少种插法?

假如一个圆排列有k个元素,那么插法就是k种(插在每两个数字之间)

假如现在有2个圆排列,分别有k,t个元素,现在要插入一个新元素,那么请问,会产生多少种不同的圆排列?

如果插入第一个圆排列中,那么有k种圆排列。

如果插入第二个圆排列中,有t种圆排列。

由加法原则:会产生k+t种圆排列。

推广到多个圆排列,我们可以发现,有多少个元素组成,就有多少个不同的圆排列。

所以第二种情况,第n个元素插入到前面的圆排列中,会产生n-1种圆排列。

所以答案数为:(n-1)*s_{s}(n-1,m)

所以递推式子就是:s_{s}(n,m)=s_{s}(n-1,m-1)+(n-1)*s_{s}(n-1,m)

第二类斯特林数:

记作S(n,m)

表示将n个元素拆分到m个有序集合中的方案数。

还是想递推的方法:

先假设集合都是相同的。

对于第n个元素:它可以有两种拆分方法。第一种是单独放入一个集合中。

也就是说,前面n-1个元素要被放在m-1个盒子中。即S(n,m)=S(n-1,m-1)

第二种情况是和前面的数放在一起,也就是说,前n-1个数,要被放在m个集合里。即S(n-1,m),

又因为,第n个数可以放m个盒子,所以由乘法原理:m*S(n-1,m)

那么有递推式:S(n,m)=S(n-1,m-1)+m*S(n-1,m)

最后别忘记了集合是有序的,所以对集合进行排列有: m!

答案就是:m!*S(n,m)

这篇关于《洛谷深入浅出》斯特林数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/487380

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景,客户端使用 RTMP 协议向 SRS 推流,使用 RTMP 协议从 SRS 拉流,SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时,RTMP 是 SRS 的中转协议,其他协议之间的互通需要先转为 RTMP,因此,理解 SRS RTMP 直播实现是理解其他协议实现的重要前提。本文主要分析 SRS RTMP 直播功能的实现原理,相关概念和配置请参考

深入浅出Java垃圾回收机制

对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用。   这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者。如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开发经验。如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

深入浅出Stream流

Java 8的新特性之一就是流stream,配合同版本出现的 Lambda ,使得操作集合(Collection)提供了极大的便利。 案例引入 在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。 假设遇到了这么一个需求:从给定句子中返回单词长度大于5的单词列表,按长度倒序输出,最多返回3个。

深入浅出Android中的MVP模式

MVP模式是在MVC模式的基础之上改进而来的。MVP模式分为:model,view,presenter三部分。三部分的关系如下图所示: 其中PresenterCompl实现IPresenter接口,PresenterCompl中的方法要改变view时通过调用IView中的方法来实现。Model层为PresenterCompl提供数据。 也就是说之前MVC中view的控制都是在activit

洛谷刷题(7)

P8738 [蓝桥杯 2020 国 C] 天干地支 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。 地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、