【学习笔记】薛定谔的喵咪Cat—球盒问题(全详解)

【题目描述】

当一个猫在盒子里时,因为放射物的状态我们不知道,所以猫的状态我们也不知道,这就所谓猫的生死纠缠态,也是所谓的薛定谔的猫。

当我们做需要大量实验时,就需要统计猫的个数与盒子的数量,以及之间的关系。因为实验情况不同,所以我们要研究的模型也不尽相同。我们用 \(opt\) 表示。

\(opt = 1:\) 猫的颜色不同,盒子的颜色不同允许盒子为空。

\(opt = 2:\) 猫的颜色相同,盒子的颜色不同不许盒子为空。

\(opt = 3:\) 猫的颜色相同,盒子的颜色不同允许盒子为空。

\(opt = 4:\) 猫的颜色不同,盒子的颜色相同不许盒子为空。

\(opt = 5:\) 猫的颜色不同,盒子的颜色不同不许盒子为空。

\(opt = 6:\) 猫的颜色不同,盒子的颜色相同允许盒子为空。

\(opt = 7:\) 猫的颜色相同,盒子的颜色相同允许盒子为空。

\(opt = 8:\) 猫的颜色相同,盒子的颜色相同不许盒子为空。

\(opt = 9:\) 此时猫分两种颜色,黑色和白色分别各有 \(a\) 只,盒子数量和猫的个数相同,每个盒子里面只能放一只猫,并且必须满足如下限制,即每一个白色猫必须和一只黑色猫配对(白猫在黑猫前,允许嵌套)。

\(eg.\) 我们用 \(0\) 表示白猫,\(1\) 表示黑猫,则:

\(0011\),\(010101\),\(001011\) 合法。

\(1100\),\(101010\),\(010110\) 不合法。

注:某物有色代表此物每一个都不相同

给定 \(opt\),猫的数量 \(a\),盒子的数量 \(b\),将猫放入盒子,求所有本质不同的合法方案数。

【输入】

第一行包含一个整数 \(q\) 表示询问的个数,接下来 \(q\) 行,每行包含三个整数 \(opt,a,b\),分别表示当前询问的是模型 \(opt\),其中猫为 \(a\) 个,盒子为 \(b\) 个。

【输出】

输出包含 \(q\) 行,每行一个整数表示询问的答案,要求答案对 \(998244353\) 取模。

【样例】

样例输入:
9
1 3 2
2 3 2
3 3 2
4 3 2
5 3 2
6 3 2
7 3 2
8 3 2
9 3 6 样例输出:
8
2
4
3
6
4
2
1
5

【数据范围】

测试点 \(q\) \(a,b\) 包含 \(opt\)
\(1\) \(q \leqslant 5\) \(a,b \leqslant 5\) \(1\)
\(2\) \(q \leqslant 10\) \(a,b \leqslant 10\) \(1,2\)
\(3\) \(q \leqslant 15\) \(a,b \leqslant 10^6\) \(1,2,3\)
\(4\) \(q \leqslant 20\) \(a,b \leqslant 100\) \(1,2,3,4\)
\(5\) \(q \leqslant 25\) \(a,b \leqslant 100\) \(1,2,3,4,5\)
\(6\) \(q \leqslant 30\) \(a,b \leqslant 100\) \(1,2,3,4,5,6\)
\(7\) \(q \leqslant 35\) \(a,b \leqslant 100\) \(7,8\)
\(8\) \(q \leqslant 40\) \(a,b \leqslant 10^6\) \(9\)
\(9\) \(q \leqslant 45\) \(a,b \leqslant 100\) \(7,8,9\)
\(10\) \(q \leqslant 50\) \(a,b \leqslant 100\) \(1,2,3,4,5,6,7,8,9\)

【分析】

\(a\) 只喵咪放入 \(b\) 个盒子,其实就是总共 \(8\) 种球盒模型混进去了一个不明物体QAQ。

模型 球是否有色 盒是否有色 盒可否为空 计算公式
\(1\) \(b^a\) 快速幂
\(2\) × × \(C_{a-1}^{b-1}\) 组合数
\(3\) × \(C_{a+b-1}^{b-1}\) 组合数(或\(C_{a+b-1}^a\))
\(4\) × × \(S_2(a,b)\) 第二类斯特林数
\(5\) × \(b!*S_2(a,b)\) 第二类斯特林数
\(6\) × \(B_a\) 贝尔数(或\(\sum_{i=1}^bS_2(a,i)\))
\(7\) × × \(dp[a+b][b]\) \(dp[i][j]=dp[i-j][j]+dp[i-1][j-1]\)
\(8\) × × × \(dp[a][b]\) \(dp[i][j]=dp[i-j][j]+dp[i-1][j-1]\)

接下来将会以 \(“\) 喵咪 \(”\) 指代 \(“\) \(”\) 作解释。

1:快速幂

问题描述: 球有色,盒子有色,盒子可为空。\((a,b \leqslant 10^6)\)

这个应该是最简单的了。对于每一个喵咪都可以任意的安排在任意一个盒子里面,于是每只喵咪都有 \(b\) 种选择,一共 \(a\) 只喵咪。

得出答案为:\(b^a\) 。

2:组合数

问题描述: 球无色,盒子有色,盒子不可为空。\((a,b \leqslant 10^6)\)

既然喵咪都长一个样,那就把它们排成一排站好,在其之间插入 \(b-1\) 个挡板,将其分为 \(b\) 个部分,每个部分都有若干只喵咪,而\(a\) 只喵咪之间一共有 \(a-1\) 个空隙可插。

得出答案为: \(C_{a-1}^{b-1}\) 。

3:组合数

问题描述: 球无色,盒子有色,盒子可为空。\((a,b \leqslant 10^6)\)

在上述模型 \(2\) 的基础上稍作改进即可。

盒子不可为空,这说明了什么?\(a\) 只喵咪之间的一共 \(a+1\) 个空位置里面(对于这道题,喵咪队列的外面也可以插了),每个位置都可插无限个挡板(实际上最大值为 \(b-1\) 个),也就是说板子插到哪儿,同时插几根板子,都没有限制。

既然没有那么多要求,那就干脆把喵咪和板子都看作同一类元素,插进去后的状态就是这一共 \(a+b-1\) 个元素的某种排列,要求是这个排列中板子的个数为 \(b-1\)(或者说喵咪的个数为 \(a\))。

得出答案为:\(C_{a+b-1}^{b-1}\)(或\(C_{a+b-1}^a\)) 。

4:第二类斯特林数

问题描述: 球有色,盒子无色,盒子不可为空。\((a,b \leqslant 100)\)

这里的喵咪有颜色分别,也就是说每只喵咪都不相同,而盒子又都是没有区别的,那么就可以考虑将其视作集合。将盒子视为集合,喵咪视为里面的元素,恰好满足集合的定义。再看看 \(Stirling\) 数的定义:\(S_2(a,b)\) 表示将 \(a\)个不同的元素拆分成 \(b\) 个集合的方案数。于是这个问题就这样解决啦!

得出答案为:\(S_2(a,b)\) 。

5:第二类斯特林数

问题描述: 球有色,盒子有色,盒子不可为空。\((a,b \leqslant 100)\)

盒子与球 \([P1287]\)总算是找到一道例题了。。。。

在上述模型 \(4\) 的基础上稍作改进即可。

由于集合出现了颜色分别,因此对于每一种元素(喵咪们)的划分,都可以有 \(b!\) 种方案提供集合来装下这些元素。

得出答案为:\(b!*S_2(a,b)\) 。

6:贝尔数

问题描述: 球有色,盒子无色,盒子可为空。\((a,b \leqslant 100)\)

在上述模型 \(4\) 的基础上稍作改进即可。

盒子可以为空,说明划分出来的集合数目可以是任意的(当然要小于等于 \(b\) 啦QAQ),为什么呢?假如我们划分出了 \(5\) 个集合来装元素,那么剩下的 \(b-5\) 个作为空集就可以了。由于本题数据不大(\(a,b \leqslant 100\)),直接暴力枚举划分 \(1\)~\(b\) 个集合的方案数再求和就 \(ok\) 啦。

实际上就是贝尔数。

得出答案为:\(B_a=\sum_{i=1}^bS_2(a,i)\)

7 , 8:递推

关于 \(7\) 和 \(8\) 似乎有一个极其复杂数学公式推导,奈何本人能力有限,无法理解,只会递推方程解决。

先说 \(8\),再说 \(7\)。

模型8

问题描述: 球无色,盒子无色,盒子不可为空。\((a,b \leqslant 100)\)

设 \(dp[i][j]\) 表示 \(i\) 只喵咪和 \(j\) 个盒子的方案数。

问题可理解为:求关于 \(x_{1,2,3...b}\) 的方程 \(\sum_{i=1}^b x_i=a\) \((\)为了避免方案重复:\(1 \leqslant x_1 \leqslant x_2 ... \leqslant x_b)\) 的解的个数。

这里可以分两种情况:

\((1).\) \(x_1=1\) ,

原方程可化为:\(\sum_{i=2}^b x_i=a-1\) \((1 \leqslant x_2 \leqslant x_3 ... \leqslant x_b)\),

即:\(\sum_{i=1}^{b-1} x'_i=a-1\) \((1 \leqslant x'_1 \leqslant x'_2 ... \leqslant x'_{b-1})\),

其方案数为 \(dp[a-1][b-1]\) 。

\((2).\) \(x_1 \geqslant 2\) ,

原方程可化为:\(\sum_{i=1}^b (x_i-1)=a-b\) \((2 \leqslant x_1 \leqslant x_2 ... \leqslant x_b)\),

即 \(\sum_{i=1}^b x'_i=a-b\) \((1 \leqslant x'_1 \leqslant x'_2 ... \leqslant x'_b)\),

其方案数为 \(dp[a-b][b]\)。

综上所述,递推方程为:\(dp[a][b]=dp[a-1][b-1]+dp[a-b][b]\) 。

得出答案为: \(dp[a][b]\)。

模型7

问题描述: 球无色,盒子无色,盒子可为空。\((a,b \leqslant 100)\)

在上述模型 \(8\) 的基础上稍作改进即可。

盒子可以为空就意味着多了一种情况:\(x_?=0\),可以在方程两边同时加上一个 \(b\),原方程可化为:\(\sum_{i=1}^b (x_i+1)=a+b\) \((0 \leqslant x_1 \leqslant x_2 ... \leqslant x_b)\),

问题可转化为:求关于 \(x'_{1,2,3...b}\) 的方程 \(\sum_{i=1}^b x'_i=a+b\) \((1 \leqslant x'_1 \leqslant x'_2 ... \leqslant x'_b)\)的解的个数。和模型 \(8\) 里那个问题一样,只是这里的答案要变一下 。

得出答案为:\(dp[a+b][b]\)。

9:Catalan数

(部分摘自百度百科以及\(Silent\)_\(EAG\))

问题描述: 此时猫分两种颜色,黑色和白色分别各有 \(a\) 只,盒子数量和猫的个数相同,每个盒子里面只能放一只猫,并且必须满足如下限制,即每一个白色猫必须和一只黑色猫配对(白猫在黑猫前,允许嵌套)。\((a,b \leqslant 10^6)\)

\(eg.\) 我们用 \(0\) 表示白猫,\(1\) 表示黑猫,则:

\(0011\),\(010101\),\(001011\) 合法。

\(1100\),\(101010\),\(010110\) 不合法。

实际上这已经不能算是球盒模型的问题了,只是 \(Catalan\) 的一种变型而已。

当时这道题作为一道 \(noip\) 考前模拟的压轴题,是一个学长自己出的,后来他告诉我们:正规考式的压轴题一般都是这种按子问题得分的形式,而且为了防 \(AK\) 会把最后一问设置地极其反人类,当时我就懵逼了。。。现在想想好像难度也不是太高,只要对 \(Catalan\) 熟悉,看一眼就知道是简单套路,或者直接打个表也能看出来 \((\) \(Catalan\) 数的前几项: \(1,1,2,4,14,42,132)\)。

关于这个问题的 \(6\) 种变型

(1). 火车进出栈

一个栈的进栈序列为 \(1,2,3,..n,\) 有多少个不同的出栈序列?

(2). 找零钱(找一半)

有 \(2n\) 个人排成一行进入剧场。入场费 \(5\) 元。其中只有 \(n\) 个人有一张 \(5\) 元钞票,另外 \(n\) 人只有 \(10\) 元钞票,剧院无其它钞票,问有多少中方法使得只要有 \(10\) 元的人买票,售票处就有 \(5\) 元的钞票找零?

(3). 三角网格



形如这样的直角三角形网格,从左上角开始,只能向右走和向下走,问总共有多少种走法?

(4). 括号排列

有 \(n\) 对括号,可以并列或嵌套排列,共有多少种情况?

(5). 球盒问题

见上。

(6). 最适合理解的模型

\(n\) 个 \(0\) 和 \(n\) 个 \(1\) 组成一个 \(2n\) 位的 \(2\) 进制数,要求从左到右扫描时,\(1\) 的累计数始终都小于等于 \(0\) 的累计数,求满足条件的数有多少?

理解方式

模型
\((1)\) 入栈 出栈
\((2)\) 用 \(5\) 元支付 用 \(10\) 元支付
\((3)\) 向下走 向右走
\((4)\) 左括号 右括号
\((5)\) \(0\) \(1\)
\((6)\) \(0\) \(1\)

注:同列事件可视为等价,且在题目要求中左边事件的次数/大小需要始终大于右边

观察模型 \((6)\):在 \(2n\) 位上填入 \(n\) 个 \(0\) 的方案数为 \(C_{2n}^n\)。而从 \(C_{2n}^n\) 中减去不符合要求的方案数即为所求答案。

在从左往右扫时,必然会在某一个奇数位 \(2p+1\) 上首先出现 \(p+1\) 个 \(1\),和 \(p\) 个 \(0\)

此后的 \([2p+2,2n]\) 上的 \(2n−(2p+1)\) 位有 \(n−p\) 个 \(0\) , \(n−p−1\) 个 \(1\)。如若把后面这部分 \(2n−(2p+1)\) 位的 \(1\) 与 \(0\) 互换,使之成为 \(n−p\) 个 \(1\),\(n−p−1\) 个 \(0\),结果得 \(1\) 个由 \(n+1\) 个 \(1\) 和 \(n−1\) 个 \(0\) 组成的 \(2n\) 位数,即一个不合法的方案必定对应着一个由 \(n+1\) 个 \(1\) 和 \(n-1\) 个 \(0\) 组成的一个排列

还可以倒过来反证:

任意一个由 \(n+1\) 个 \(1\) 和 \(n-1\) 个 \(0\) 组成的一个排列,由于 \(1\) 的个数多了 \(2\) 个,且 \(2n\) 为偶数,所以必定在某个奇数位 \(2p+1\) 上出现 \(1\) 的个数超过 \(0\) 的个数。同样把后面部分 \(1\) 和 \(0\) 互换,成为了由 \(n\) 个 \(0\) 和 \(n\) 个 \(1\) 组成的 \(2n\) 位数。

由此,每一个不合法的方案总是与唯一一个由 \(n+1\) 个 \(1\) 和 \(n−1\) 个 \(0\) 组成的排列一一对应。

于是,不合法的方案数就可以写作:\(C_{2n}^{n+1}\),得出答案为: \(Catalan(n)=C_{2n}^n-C_{2n}^{n+1}\)。

可以将这个式子再化简一下:

\(\begin{aligned} \text Catalan(n) &=C_{2 n}^{n}-C_{2 n}^{n+1} \\ &=\frac{(2 n) !}{n ! n !}-\frac{(2 n)}{(n+1) !(n-1) !} \\ &=\frac{(2 n) !}{\frac{n+1}{n+1} * n(n-1) !}-\frac{(2 n) !}{(n+1) !(n-1) !} \\ &=\frac{(2 n) !}{(n+1) ! *(n-1) !} *\left(\frac{n+1}{n}-1\right) \\ &=\frac{(2 n) !}{(n+1) n ! *(n-1) !} * \frac{1}{n} \\ &=\frac{(2 n) !}{(n+1) n ! * \frac{n !}{n+1}} \\ &=\frac{C_{2 n}^{n}}{n+1} \end{aligned}\)

【Code】

#include<cstdio>
#define LL long long
#define Re register LL
const int P=998244353,N=1e6+5;
LL T,a,b,f,opt,cnt,jc[N*2+5],dp[205][205],S[105][105];
inline void in(Re &x){
x=f=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
if(f)x=-x;
}
inline LL mi(Re x,Re k){
Re ans=1;
while(k){
if(k&1)ans=(ans*x)%P;
x=(x*x)%P;k>>=1;
}
return ans%P;
}
inline LL niv(Re x){return mi(x,P-2);}
inline LL c(Re m,Re n){
if(n<m)return 0;
if(n<P)return jc[n]*niv(jc[m])%P*niv(jc[n-m])%P;
return c(m/P,n/P)*c(m%P,n%P)%P;
}
inline void Stirling(){
for(Re i=0;i<=100;++i)S[i][i]=1;
for(Re i=1;i<=100;++i)
for(Re j=1;j<=100;++j)
S[i][j]=(S[i-1][j-1]+S[i-1][j]*j%P)%P;
}
inline void DP(){
dp[0][0]=1;
for(Re i=1;i<=200;++i)
for(Re j=1;j<=i;++j)
dp[i][j]=(dp[i-j][j]+dp[i-1][j-1])%P;
}
inline LL Catalan(Re n){return c(n,n<<1)*niv(n+1)%P;}
int main(){
// freopen("cat.in","r",stdin);
// freopen("cat.out","w",stdout);
jc[0]=1;for(Re i=1;i<=N*2;i++)jc[i]=jc[i-1]*i%P;
in(T);Stirling();DP();
while(T--){
in(opt),in(a),in(b);
if(opt==1)printf("%lld\n",mi(b,a));
else if(opt==2)printf("%lld\n",c(b-1,a-1));
else if(opt==3)printf("%lld\n",c(b-1,a+b-1));
else if(opt==4)printf("%lld\n",S[a][b]);
else if(opt==5)printf("%lld\n",jc[b]*S[a][b]%P);
else if(opt==6){
Re ans=0;
for(Re i=1;i<=b;++i)(ans+=S[a][i])%=P;
printf("%lld\n",ans);
}
else if(opt==7)printf("%lld\n",dp[a+b][b]);
else if(opt==8)printf("%lld\n",dp[a][b]);
else if(opt==9)printf("%lld\n",Catalan(a));
}
}

【学习笔记】薛定谔的喵咪Cat—球盒问题(全详解)的更多相关文章

  1. linux初级学习笔记七:linux用户管理,密码和组命令详解!(视频序号:04_1)

    本节学习的命令: 用户管理命令:useradd,userdel,id,finger,usermod,chsh,chfn,passwd,pwck, 组管理命令:groupadd,groupmod,gro ...

  2. web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解

    1.方法 getElementsByName() 获取name 可以获取一个数组类型数据(参数加引号) getElementsByTagName() 获取元素   getAttribute() 获取元 ...

  3. 当Python中混进一只薛定谔的猫……

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/-fFVTgWVsydFsNu1nyxUzA Python 是一门强大的 ...

  4. 年年出妖事,一例由JSON解析导致的"薛定谔BUG"排查过程记录

    前言 做开发这么多年,也碰到无数的bug了.不过再复杂的bug,只要仔细去研读代码,加上debug,总能找到原因. 但是最近公司内碰到的这一个bug,这个bug初看很简单,但是非常妖孽,在一段时间内我 ...

  5. Shell学习(七)——sort、uniq、cut、wc命令详解

    Shell学习(七)--sort.uniq.cut.wc命令详解 转自:[1]linux sort,uniq,cut,wc命令详解 https://www.cnblogs.com/ggjucheng/ ...

  6. 【Redis】命令学习笔记——哈希(hash)(15个超全字典版)

    本篇基于redis 4.0.11版本,学习哈希(hash)相关命令. hash 是一个string类型的field和value的映射表,特别适合用于存储对象. 序号 命令 描述 实例 返回 HSET ...

  7. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  8. TortoiseGit学习系列之Windows上本地代码如何通过TortoiserGit提交到GitHub详解(图文)

    不多说,直接上干货! 前面博客 TortoiseGit学习系列之Windows上TortoiseGit的安装详解(图文) 上面博文给大家讲解了一下如何本地安装TortoiseGit. 这篇为大家讲一下 ...

  9. 学习《深度学习与计算机视觉算法原理框架应用》《大数据架构详解从数据获取到深度学习》PDF代码

    <深度学习与计算机视觉 算法原理.框架应用>全书共13章,分为2篇,第1篇基础知识,第2篇实例精讲.用通俗易懂的文字表达公式背后的原理,实例部分提供了一些工具,很实用. <大数据架构 ...

随机推荐

  1. 新mac 下第一次 安装 mongodb 步骤

    新入手mac,安装mongo步骤记录:不建议使用网上的brew安装方法,因为试了半天没有成功,应该是新版本限制比较多! 从mongodb官网下载mac版本mongo: 1.访问MongoDB官方下载地 ...

  2. JS实现16进制和RGB转换

    作为前端开发而言,不可避免的会遇到颜色取值,字符串和数字直接的转换,博主为此写了一个小工具,实现色值之间的在线转换. 前置知识点: parseInt, toString parseInt(value ...

  3. FCC-学习笔记 Boo who

    FCC-学习笔记  Boo who 1>最近在学习和练习FCC的题目.这个真的比较的好,推荐给大家. 2>中文版的地址:https://www.freecodecamp.cn/;英文版的地 ...

  4. 春秋-SQLi题

    这道题挺好的 学到的知识 sprintf()构成的sql注入漏洞 题目环境今天做的时候坏了 留下这几篇博客学习 https://blog.csdn.net/nzjdsds/article/detail ...

  5. 《高性能 Go 代码工坊》中译

    深入研究 Go 应用性能提升的英语系列文章,这里是中译 https://www.yuque.com/ksco/uiondt

  6. JS高阶---继承模式(原型链继承)

    [前言] 之前已经介绍了对象创建的五种模式,下面看下继承模式 本节介绍下<原型链继承> [主体] 验证如下: 关键点: .

  7. C#基础操作符详解(下)

    书接上文的基本操作符,下文介绍的是其他操作符: 4.2一元操作符: 只要有一个操作数跟在它后面就可以构成表达式,也叫单目操作符. ①&x和*x操作符(很少见有印象即可): 这两个操作符同样也需 ...

  8. 添加ssh密钥

    直接运行ssh-keygen,可以不输入密码 $ ssh-keygen Generating public/private rsa key pair. Enter file in which to s ...

  9. CentOS 8 正式发布!

    CentOS 8 正式发布! CentOS 8 和 RedHat Enterprise Linux 8 发行的版本是一致的,都是基于 Fedora 28 和 内核 4.18.支持传统的.新兴的工作负载 ...

  10. 本地jar包在maven工程中pom引用

    背景   在使用Maven的过程中,经常碰到有些jar包在中央仓库没有的情况.如果公司有私服,那么就把jar包安装到私服上.如果没有私服,那就把jar包安装到本地Maven仓库.下面是如何把jar包导 ...