hdu3625
hdu3625
题意:
酒店发生一起谋杀案。作为镇上最好的侦探,您应该立即检查酒店的所有N个房间。但是,房间的所有门都是锁着的,钥匙刚锁在房间里,真是个陷阱!您知道每个房间里只有一把钥匙,并且所有可能的分配可能性均等。例如,如果N = 3,则有6种可能的分布,每种分布的概率为1/6。为方便起见,我们将房间编号从1到N,房间1的键编号为键1,房间2的键编号为2,依此类推。
要检查所有房间,您必须用力摧毁一些门。但是您不想破坏太多,因此您采取以下策略:首先,您手中没有钥匙,因此您会随机破坏一扇锁着的门,进入房间,检查并取出其中的钥匙。然后,也许您可以使用新钥匙打开另一个房间,检查一下并获得第二把钥匙。重复此操作,直到您无法打开任何新房间。如果仍然有未检查的房间,则必须随机挑选另一扇未打开的门用力摧毁,然后重复上述步骤,直到检查完所有房间为止。
现在只允许您强行摧毁最多K门。更重要的是,房间1中有一个非常重要的人物。不允许您破坏房间1的门,也就是说,检查房间1的唯一方法是使用相应的钥匙打开房间。您想知道最终检查所有房间的概率是什么。(来自一键翻译)
分析
等价于将 $n$ 个元素分成 $k$ 个子集,其中1号元素不能单独成一个子集,$k$ 可以取1至K.
所以,设 $s(n,i)$ 为第一类Stirling数,可行方案为 $\sum_{i=1}^k s(n, i)-s(n-1, i-1)$,总方案数为 $n!$
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = + ;
ll fact[maxn], stir[maxn][maxn]; void init()
{
fact[] = ;
for(int i = ;i < maxn;i++) fact[i] = fact[i-] * i; stir[][] = ;
stir[][] = ;
for(int i = ;i < maxn;i++)
for(int j = ;j <= i;j++)
stir[i][j] = stir[i-][j-] + (i-)*stir[i-][j];
} int main()
{
init();
int T;
scanf("%d", &T);
while(T--)
{
int n, k;
scanf("%d%d", &n, &k);
ll ans = ;
for(int i = ;i <= k; i++)
ans += stir[n][i] - stir[n-][i-];
printf("%.4f\n", 1.0*ans/fact[n]);
}
return ;
}
Codejam4214486 A Password Attacker
题意:一串长度为 $N$ 的密码恰有 $M$ 种字符组成,求可能的字符串的种数。
分析:把 $n$ 个位置看作 $n$ 个有区别的小球,问题等价于将 $n$ 个有区别的球放到 $m$ 个不同的盒子里,且无空盒的方案数,易知,方案数为 $m!s(n, m)$,其中 $s(n, m)$ 为第二类Stirling数。
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = +;
const ll mod =;
ll fact[maxn], stir[maxn][maxn]; void init()
{
fact[] = ;
for(int i = ;i < maxn;i++) fact[i] = fact[i-] * i % mod; stir[][] = ;
stir[][] = ;
for(int i = ;i < maxn;i++)
for(int j = ;j <= i;j++)
stir[i][j] = (stir[i-][j-] + j*stir[i-][j]) % mod;
} int main()
{
freopen("A-large-practice.in", "r", stdin);
freopen("a.out", "w", stdout); init();
int T, kase = ;
scanf("%d", &T);
while(T--)
{
int n, m;
scanf("%d%d", &m, &n);
ll ans = fact[m] * stir[n][m] % mod;
printf("Case #%d: %lld\n", ++kase, ans);
}
return ;
}
参考链接:
1. https://blog.csdn.net/doyouseeman/article/details/50876786
2. https://blog.csdn.net/ACdreamers/article/details/8521134
hdu3625的更多相关文章
- 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms
Examining the Rooms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU3625(SummerTrainingDay05-N 第一类斯特林数)
Examining the Rooms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu3625(第一类斯特林数)
与第二类有些区别! #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- HDU3625 Examining the Rooms
@(HDU)[Stirling數] Problem Description A murder happened in the hotel. As the best detective in the t ...
随机推荐
- springboot异步线程
前言 最近项目中出现了一个问题,发现自己的定时器任务在线上没有执行,但是在线下测试时却能执行,最后谷歌到了这篇文章SpringBoot踩坑日记-定时任务不定时了?; 本篇文章主要以自己在项目中遇到的问 ...
- 修改Jupyter Notebook的默认打开路径
一: (也可以直接将删除的部分修改成所要存储的文件路径,之后三个步骤就可以省去了) 二: 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config ...
- Delphi文字转语音TTS【支持选择语音库,播放,暂停,开始,停止,生成语音文件,设置音量,设置语速】
作者QQ:(648437169) 点击下载➨文字转语音TTS [Delphi 文字转语音TTS]调用系统自带的TTS组件,支持XP,vista,win7,win8,win10系统,支持选择语音库,播放 ...
- delphi xe6 JSON 测试
System.JSON ISuperJSOn mORMETJSON QJSON 测试 我在测试时发现系统自带的JSON 占用内存大一但多了就会出现内存泄漏的问题 我用的Flst< ...
- 详解java动态代理机制以及使用场景
详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...
- java之spring mvc之初始spring mvc
1. mvc : mvc框架是处理 http请求和响应的框架 2. mvc 做的事情有哪些: 将 url 映射到一个java的处理方法上 将表单数据提交到 java 类中 将后台 java 类处理的结 ...
- Python DBUtils 连接池对象 (PooledDB)
数据处理框架用到 mysql, 需要在多进程中的多线程中使用 mysql 的连接 使用到的模块: DBUtils 实现: 使用 DBUtils 中的 PooledDB 类来实现. 自己写一个类, 继承 ...
- 独热编码(One-Hot)的理解
https://www.imooc.com/article/35900 参考上面大神的原文,说的非常透彻.非常便于理解.感谢 感谢 自己做个小笔记,便于自己学习 特征值是离散的,无序的. 如: 性别特 ...
- 【面试突击】- Java面试总则
Java基础 1.Map.Set.List集合差别及联系详解 2.HashSet类是如何实现添加元素保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安 ...
- Java 之 HTTP 协议
HTTP 协议 一.基础 1.概念 HTTP:Hyper Text Transfer Protocol 超文本传输协议. 传输协议:定义了客户端和服务器端通信时,发送数据的格式. 2.特点 (1)基 ...