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的更多相关文章

  1. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. HDU3625(SummerTrainingDay05-N 第一类斯特林数)

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. hdu3625(第一类斯特林数)

    与第二类有些区别! #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  4. HDU3625 Examining the Rooms

    @(HDU)[Stirling數] Problem Description A murder happened in the hotel. As the best detective in the t ...

随机推荐

  1. (语法基础)浅谈面向切面编程(AOP)

    一:前言 面向切面编程是一个很重要的编程思想,想要写出一个便于维护的程序,理解AOP并且能熟练的在实际编程中合理的运用AOP思想是很有必要的 二:AOP的基本概念 基础概念:AOP中文翻译面向切面编程 ...

  2. xe.10.2的下载路径

    为了这个玩意,我折腾了一天,为了以后自己还用到 官网地址: http://altd.embarcadero.com/download/radstudio/10.2/delphicbuilder10_2 ...

  3. Java的访问修饰符的作用范围

    访问修饰符: private default protected public 作用范围: 访问修饰符\作用范围 所在类 同一包内其他类 其他包内子类 其他包内非子类 private 可以访问 不可以 ...

  4. (六)pdf的构成之文件体(pages对象)

    页面树(pages) 通过页面树访问文档的页面,页面树定义PDF文档中的所有页面.树包含表示PDF文档页面的节点,可以是两种类型:中间节点和叶节点.中间节点也称为页面树节点,而叶节点称为页面对象.最简 ...

  5. 最新版Prometheus+Grafana+node-exporter炫酷界面

    一.概述 理论知识就不多介绍了,参考链接: https://www.cnblogs.com/xiao987334176/p/9930517.html 本文使用2台服务器,来搭建. 环境 操作系统 do ...

  6. Spring-Boot之Admin服务监控-9

    一.Spring Boot Admin用于管理和监控一个或者多个Spring Boot程序.Spring Boot Admin分为Server端和Client 端,Client端可以通过向Http S ...

  7. crunch制作字典

    安装 安装crunch sudo apt-get install crunch 语法 crunch <min> max<max> <characterset> -t ...

  8. 【MySQL】数据库中间件Atlas

    1.介绍 Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改 ...

  9. Android Studio 打包生成apk

    打开AndroidStudio,并且打开想要生成apk文件的项目  点击工具栏上面的“Builder”  点击“Builder”之后在下拉菜单里面可以看到“Genarate Singed APK”,点 ...

  10. Appscan漏洞之已解密的登录请求

    本次针对 Appscan漏洞 已解密的登录请求 进行总结,如下: 1.1.攻击原理 未加密的敏感信息(如登录凭证,用户名.密码.电子邮件地址.社会安全号等)发送到服务器时,任何以明文传给服务器的信息都 ...