组合数学 —— 斯特林数(Stirling)

article/2025/9/22 22:08:47

【第一类斯特林数】

1.定理

第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目。

2.递推式

设人被标上1,2,.....p,则将这 p 个人排成 m 个圆有两种情况:

  • 在一个圆圈里只有标号为 p 的人自己,排法有 S1(n-1,m-1) 个。
  • p 至少和另一个人在一个圆圈里。

这些排法通过把 1,2....n-1 排成 m 个圆再把 n 放在 1,2....n-1 任何一人左边得到,因此第二种类型排法共有 (n-1)*S1(n-1,m) 种。

我们所做的就是把 {1,2,...,p} 划分到 k 个非空且不可区分的盒子,然后将每个盒子中的元素排成一个循环排列。

综上,可得出第一类Stirling数定理:S1(n,m)=(n-1)*S1(n-1,m)+S1(n-1,m-1) (n>1,m>1)

边界条件:

  • S1(n,m)=1 (n>=0):有 n 个人和 n 个圆,每个圆只有一个人
  • S1(n,0)=0 (n>=1) :如果至少有 1 个人,那么任何的安排都至少包含一个圆

3.应用举例

第一类斯特林数除了可以表示升阶函数和降阶函数的系数之外还可以应用到一些实际问题上,比如很经典的解锁仓库问题。

问题说明:

有 n 个仓库,每个仓库有两把钥匙,共 2n 把钥匙。同时又有 n 位官员。

求:①如何放置钥匙使得所有官员都能够打开所有仓库?(只考虑钥匙怎么放到仓库中,而不考虑官员拿哪把钥匙。)

       ②如果官员分成 m 个不同的部,部中的官员数量和管理的仓库数量一致。那么有多少方案使得,同部的所有官员可以打开所有本部管理的仓库,而无法打开其他部管理的仓库?(同样只考虑钥匙的放置。)

分析:

① 打开仓库将钥匙放入仓库构成一个环:1号仓库放2号钥匙,2号仓库放3号钥匙……n号仓库放1号钥匙,这种情况相当于钥匙和仓库编号构成一个圆排列方案数是 (n-1)! 种。

② 对应的将 n 个元素分成 m 个圆排列,方案数就是第一类斯特林数 S1(n,m),若要考虑官员的情况,只需再乘上 n! 即可。

4.算法实现

const int mod=1e9+7;//取模
LL s[N][N];//存放要求的第一类Stirling数
void init(){memset(s,0,sizeof(s));s[1][1]=1;for(int i=2;i<=N-1;i++){for(int j=1;j<=i;j++){s[i][j]=s[i-1][j-1]+(i-1)*s[i-1][j];if(s[i][j]>=mod)s[i][j]%=mod;}}
}

【第二类斯特林数】

1.定理

第二类斯特林数 S2(n,m) 表示的是把 n 个不同元素划分到 m 个集合的方案数。

2.递推式

元素在哪些集合并不重要,唯一重要的是各集合里装的是什么,而不管哪个集合装了什么。

考虑将前 n 个正整数,{1,2,...,n} 的集合作为要被划分的集合,把 {1,2,...,n} 分到 m 个非空且不可区分的集合的划分有两种情况:

  • 那些使得 n 自己单独在一个集合的划分,存在有 S2(n-1,m-1) 种划分个数
  • 那些使得 n 不单独自己在一个盒子的划分,存在有 m*S2(n-1,m) 种划分个数

考虑第二种情况,n 不单独自己在一个盒子,也就是 n 和其他元素在一个集合里面,也就是说在没有放 n 之前,有 n-1 个元素已经分到了m 个非空且不可区分的盒子里面(划分个数为 S2(n-1,m)),那么现在问题是把 n 放在哪个盒子里面,此时有 m 种选择,所以存在有 m*S2(n-1,m)

综上,可得出第二类斯特林数定理: S2(n,m)=m*S2(n-1,m)+S2(n-1,m-1) (1<=m<=n-1)

边界条件:\left\{\begin{matrix}S2(n,m)=1 ,n>=0 \\S2(n,0)=0,n>=1 \end{matrix}\right. 

3.应用举例

第二类斯特林数主要是用于解决组合数学中的放球模型,主要是针对于球之前有区别的放球模型:

1)n 个不同的球,放入 m 个无区别的盒子,不允许盒子为空。

     方案数:S2(n,m),与第二类斯特林数的定义一致。

2)n 个不同的球,放入 m 个有区别的盒子,不允许盒子为空。

     方案数:m!*S2(n,m),因盒子有区别,乘上盒子的排列即可。

3)n 个不同的球,放入 m 个无区别的盒子,允许盒子为空。

     方案数:,枚举非空盒的数目即可。

4)n 个不同的球,放入 m 个有区别的盒子,允许盒子为空。

    ① 方案数: ,枚举非空盒的数目,注意到盒子有区别,乘上一个排列系数即可。

    ② 既然允许盒子为空,且盒子间有区别,那么对于每个球有 m 种选择,每个球相互独立。有方案数:

4.算法实现

const int mod=1e9+7;//取模
LL s[N][N];//存放要求的Stirling数
void init(){memset(s,0,sizeof(s));s[1][1]=1;for(int i=2;i<=N-1;i++){for(int j=1;j<=i;j++){s[i][j]=s[i-1][j-1]+j*s[i-1][j];if(s[i][j]>=mod)s[i][j]%=mod;}}
}

5.扩展:S(n,m) 的奇偶性 

求 S(n,m) 的奇偶性实质就是求 S(n,m)%2

对于第二类斯特林数,首先有:S[i][j]=S[i−1][j−1]+j∗S[i−1][j]

那么在模 2 的情况下 ,有:

  • 当 j 为偶数:S[i][j] ≡(S[i−1][j−1]%2)
  • 当 j 为奇数:S[i][j] ≡((S[i−1][j−1]+S[i−1][j])%2)

于是,可以倒过来,即有:

  • 当 j 为偶数时:S[i][j] 会被加到 S[i+1][j+1] 和 S[i+1][j] 
  • 当 j 为奇数时:S[i][j] 会被加到 S[i+1][j+1]

于是,令 a=n−m,b=(m+1)/2,则答案就相当于把 a 个相同的球分成 b 组,每组个数可以为 0 的方案总数,即:C(b−1,a+b−1)

然后利用 C(n,m) 为奇数时有 n&m=n 的结论,进行判断即可

int calc(int n,int m){return (m&n)==n;
}
int main(){int n,m;scanf("%d%d",&n,&m);if(n==0&&m==0)//特判printf("1\n");else if(n==0||m==0||n<m)//特判printf("0\n");else{int a=n-m;int b=(m+1)/2;int res=calc(b-1,a+b-1);printf("%d\n",res);}return 0;
}

【两类斯特林数的关系】

两类斯特林数之间的递推式和实际含义很类似,他们之间存在一个互为转置的转化关系:

\sum_{k=0}^nS1(n,k)S2(k,m)=\sum_{k=0}^nS2(n,k)S1(k,m)

【例题】

  • Binary Stirling Numbers(POJ-1430)(第二类斯特林数):点击这里

http://chatgpt.dhexx.cn/article/HrwRheR8.shtml

相关文章

Linux Debian11创建新用户和删除用户

一、 Debian 创建 新用户 1.创建新用户 首先&#xff0c;要创建用户&#xff0c;当前用户必须是 root 用户或者 sudo 用户。 使用下面adduser 命令创建一个用户名为test的sudo用户&#xff0c;按照提示输入密码&#xff0c;使用 adduser 命令&#xff0c;还会创建用户的主目…

Linux中创建新用户,设置ID与密码

如&#xff1a;新建用户admin&#xff0c;指定在/root家目录下&#xff0c;并指定用户id为6666&#xff0c;设置密码&#xff1a;admin123 添加用户 add&#xff1a;用于创建新的系统用户 语法&#xff1a;useradd[选项] 用户名 -d 指定用户的家目录&#xff08;默认用户名目录…

Linux手工创建新用户

准备工作&#xff08;配置流程的理解&#xff09; Linux中useradd命令即一系列文件操作的结合体&#xff0c;所以我们可以通过查看useradd命令来确认我们手工创建新用户需要完成的文件配置 找到man useradd中涉及的文件部分 对于手工创建用户有用的文件&#xff1a; /etc/pas…

linux创建/删除新用户

为了完成本关任务&#xff0c;你需要掌握如下知识&#xff1a; Linux创建用户命令Linux删除用户命令 Linux创建用户命令 Linux中使用useradd命令来创建一个新用户。 命令格式格式&#xff1a; useradd [命令参数] 参数 常见命令参数&#xff1a; -d<登入目录>&…

Linux如何创建一个新的用户?

1. useradd -d /root/admin admin -u 6666 把一个用户名为admin&#xff0c;id为6666的新用户创建在指定 /root 家目录下。 2. passwd admin 给新用户admin设置密码。

Linux下如何创建新用户并设置密码及删除用户

一&#xff1a;演示创建新用户binbin 在命令行输入useradd binbin&#xff0c;表示创建新用户binbin 回车后&#xff0c;直接 ll 回车查看到 binbin 就已经创建好了 二&#xff1a;设置密码 1.1输入命令&#xff1a; passwd binbin&#xff0c;回车&#xff0c;设置用户 binb…

linux服务器创建新用户

无论是创建新用户还是删除某个用户&#xff0c;都需要拿到root用户的密码&#xff0c;才有权限创建删除。 创建新用户 首先进入root账户&#xff0c;输入以下指令&#xff0c;created_name 是我们创建的用户名&#xff0c;可以换成你想要创建的用户名称。 useradd -m -s /bi…

LINUX--创建新用户为新用户设置权限

文章目录 【一张图总结】【详细说明】1、登录root2、新建用户并创建家目录3、更改为bash命令4、设置密码5、设置sudo权限 【关于本文Linux命令的说明】1、useradd -d /home/xpt -m xpt2、usermod -s /bin/bash xpt3、sudo passwd xpt4、sudo chmod uw /etc/sudoers5、sudo vi /…

Linux系统通过命令行创建新的普通用户

以下操作在root账户或权限下执行&#xff01;&#xff01;&#xff01; 目录 1. 创建用户 2. 删除用户 1. 创建用户 创建用户分两步&#xff1a; (1) 使用adduser创建用户名 adduser 创建的用户名 (2) 设置创建用户名的密码 passwd 创建的用户名 然后就可以使用创建的用户登…

Linux-创建用户组和用户

目录 1.前提 2.用户组 3.用户 4.其他 1.前提 创建用户组和用户均需要管理员权限&#xff0c;要么是 root 用户&#xff0c;要么是现用户有 sudo 权限。 下面的命令大部分是基于 sudo 权限 2.用户组 创建用户组 sudo groupadd 组名 查看用户组 cat /etc/group 删除用…

Citespace教程笔记

1 Citespace分析和解读策略 课程连接&#xff1a;citespace教程-陈超美老师亲自教学_哔哩哔哩_bilibili 分析结果那些重要&#xff0c;那些次要&#xff0c;要从主到次地分析。 2 Citespace软件界面简介 2.1 Citespace功能参数界面 2.2 Citespace可视化界面 可视化界面的简介…

TLS Ciphers

传输层安全性协议&#xff08;英语&#xff1a;Transport Layer Security&#xff0c;缩写作TLS&#xff09;&#xff0c;及其前身安全套接层&#xff08;Secure Sockets Layer&#xff0c;缩写作SSL&#xff09;是一种安全协议 定义 协议 年份 SSL 1.0 未知 SSL 2.0 199…

NO Ciphertext RSA -BugkuCTF

题目 附件 这里给了dp&#xff0c;可以根据dp爆破出p&#xff0c;q n dp e 65537 for x in range(1, e):if(e*dp%x1):p(e*dp-1)//x1if(n%p!0):continue print(p,p) q n//p print(q,q) 现在来到了难点&#xff0c;c不知如何去求&#xff0c;这里给了leak_c1&#xff0c…

[DiceCTF 2023] rSabin

一点点学习别人的WP&#xff0c;这回看到一个大姥(r3kapig)的帖子&#xff0c;DiceCTF第二名&#xff0c;不过有好多东西一时还理解不了&#xff0c;得慢慢来。 题目 这个题有3个功能&#xff1a; rsa加密功能&#xff0c;p,q,N未知&#xff0c;e17低加密指数 解密&#xff0c;…

[密码学复习]Cryptography

整合 Week 2对称加密 Two requirements: A strong encryption algorithmA secret key known only to participants. 1. 有三部分构成&#xff1a; 1.加密算法 2.可能使用的密钥数量&#xff1a;数量越大越安全 3.text文本的处理&#xff1a;分为stream ciphers整段传输和…

python实现凯撒加密和暴力破解凯撒加密(源码及运行结果截图)

文章目录 原理太简单就不赘述了&#xff01; 一、凯撒加密&#xff08;源码&#xff09;二、暴力破解凯撒加密&#xff08;源码&#xff09;三、运行结果截图 原理太简单就不赘述了&#xff01; 一、凯撒加密&#xff08;源码&#xff09; plaintext input("请输入明文…

【Python】cryptography和pycryptodome库使用

题目&#x1f447; &#xff08;1&#xff09;使用cryptography模块&#xff0c;编写完整的AES-CBC加解密函数&#xff0c;函数接口为&#xff1a; def encrypt_CBC(key, plaintext, iv)、def decrypt_CBC(key, ciphertext, iv)&#xff1b; &#xff08;2&#xff09;使用p…

《A Graduate Course in Applied Cryptography》Chapter 12 Chosen ciphertext secure pkc(4)finish

原文教材 与 参考资料&#xff1a; Boneh Dan , Shoup Victor . A Graduate Course in Applied Cryptography[J]. 该书项目地址&#xff08;可以免费获取&#xff09;&#xff1a;http://toc.cryptobook.us/ 博客为对该书的学习笔记&#xff0c;并非原创知识&#xff0c;帮助理…

Aleo隐私智能合约编程__第四章__部署进链上Aleo Testnet3网络

文章目录 安装相关软件账户数据准备部署隐私应用 相关资料链接 官方部署文档 https://developer.aleo.org/testnet/getting_started/deploy_execute_demo/查看链上所有的程序 https://explorer.hamp.app/programs测试网领水 https://twitter.com/AleoFaucetAleo SDK在线工具 ht…

《A Graduate Course in Applied Cryptography》Chapter 12 Chosen ciphertext secure pkc(3)

原文教材 与 参考资料&#xff1a; Boneh Dan , Shoup Victor . A Graduate Course in Applied Cryptography[J]. 该书项目地址&#xff08;可以免费获取&#xff09;&#xff1a;http://toc.cryptobook.us/ 博客为对该书的学习笔记&#xff0c;并非原创知识&#xff0c;帮助理…