Description

Input

Output

一般概率题有两种套路:

  1. 满足条件的方案/总方案.
  2. 直接求概率.
第一种方法比较好理解,这道题这么做的话也非常简单.
这里讲一下第二种方法:
易得箱子之间都是环的关系,令 $f[i][j]$ 表示一共开了 $j$ 个箱子并成功打开前 $i$ 个环的概率. 
则 $f[i][j+p]+=\frac{f[i-1][j]\times C^{j}_{sum[i-1]}\times C^{p}_{c_{i}}} {C_{sum[i]}^{j+p}}$        
我们强制给第 $i$ 个环分配 $p$ 个箱子,那么产生这种情况的概率是 $\frac{C^{j}_{sum[i-1]}\times C^{p}_{c_{i}}} {C_{sum[i]}^{j+p}}$,而还需满足前 $i-1$ 个箱子也被打开,那么这个概率就是 $f[i-1][j]$,这两个相乘就是发生当前局面的概率. 
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define N 307
using namespace std;
double fac[N],f[N][N];
bool vis[N];
int cir[N],sum[N],a[N];
inline void calc()
{
int n,k,i,j,tot=0,p;
scanf("%d%d",&n,&k);
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
for(i=1;i<=n;++i) scanf("%d",&a[i]), fac[i]=fac[i-1]+log(i);
for(i=1;i<=n;++i)
{
if(vis[i]) continue;
cir[++tot]=0;
for(j=i;!vis[j];j=a[j]) vis[j]=1,cir[tot]++;
}
sum[0]=0,f[0][0]=1.0000;
for(i=1;i<=tot;++i) sum[i]=sum[i-1]+cir[i];
for(i=1;i<=tot;++i)
for(j=i-1;j<k&&j<=sum[i-1];++j)
for(p=1;p<=cir[i]&&j+p<=k;++p)
{
double tmp=exp(fac[sum[i-1]]+fac[cir[i]]+fac[j+p]+fac[sum[i]-j-p]-fac[j]-fac[sum[i-1]-j]-fac[p]-fac[cir[i]-p]-fac[sum[i]]);
f[i][j+p]+=f[i-1][j]*tmp;
}
printf("%.9f\n",f[tot][k]);
}
int main()
{
// setIO("input");
int T,i,j;
scanf("%d",&T);
for(i=1;i<=T;++i) calc();
return 0;
}

  

BZOJ 5004: 开锁魔法II 期望 + 组合的更多相关文章

  1. BZOJ 5004: 开锁魔法II

    比较显然 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; i ...

  2. bzoj5003: 与链 5004: 开锁魔法II 5005:乒乓游戏

    www.lydsy.com/JudgeOnline/upload/task.pdf 第一题题意可以转为选一个长度k的序列,每一项二进制的1的位置被下一项包含,且总和为1,考虑每个二进制位的出现位置,可 ...

  3. 【bzoj5004】开锁魔法II 组合数学+概率dp

    题目描述 有 $n$ 个箱子,每个箱子里有且仅有一把钥匙,每个箱子有且仅有一把钥匙可以将其打开.现在随机打开 $m$ 个箱子,求能够将所有箱子打开的概率. 题解 组合数学+概率dp 题目约定了每个点的 ...

  4. hrb——开锁魔法I——————【规律】

    解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ...

  5. hihocoder1075【开锁魔法】

    hihocoder1075[开锁魔法] 题意是给你一个 \(1-n\) 的置换,求选 \(k\) 个可以遍历所有点的概率. 题目可以换个模型:有 \(n\) 个球,有 \(cnt\) 种不同的颜色,求 ...

  6. HihoCoder 1075 开锁魔法III(概率DP+组合)

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

  7. hihocoder 1075 : 开锁魔法III

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

  8. #1075 : 开锁魔法III

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

  9. Hiho #1075: 开锁魔法III

    Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...

随机推荐

  1. Java四类八项基本数据类型

    一. 四类八项基本数据类型 1. 整数类型(byte.short.int.long) 三点注意事项: a. Java各整数类型有固定的表示范围和字段长度,其不收操作系统的影响,以保持Java的可移植性 ...

  2. Spring Boot解决无法访问图片的问题

    找了很多Spring Boot项目访问图片的解决方式,发现都是配置的,有时配置了也没有用.然后自己研究了一种简单操作的方法. 1,在Spring Boot的static目录下创建一个新目录img(或者 ...

  3. pyrhon 开始 基础类型

    https://repl.it/languages/python  线上编辑器 字符串不支持  减法 除法

  4. LeetCode 338. 比特位计数

    338. 比特位计数 题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 示例 1: 输入: 2 输出 ...

  5. RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

    原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  6. js自执行函数

    5.1对于函数表达式,在后面加括号即可以让函数立即执行:例如下面这个函数,至于为什么加了括号就可以立即执行,我们可以这么理解,就是像fn1():这样写的话,函数 可以立即执行是没问题的,我们在经常会用 ...

  7. 基于HttpRunner,解析swagger数据,快速生成接口测试框架

    使用HttpRunner默认生成的项目是这样的 命令:httprunner --startproject  项目名称 so,根据这个项目的目录结构,使用python解析swagger接口参数,可以快速 ...

  8. redis 模拟redis server接收信息

    一.实现说明 客户端使用jedis正常set值到redis服务器   2. 模拟服务器接收jedis发送的信息 二.jedis客户端代码 package com.ahd.redis; import r ...

  9. 2019-11-29-Roslyn-使用-Directory.Build.props-文件定义编译

    title author date CreateTime categories Roslyn 使用 Directory.Build.props 文件定义编译 lindexi 2019-11-29 08 ...

  10. Wiki 安装部署

    #首先登陆进入 MySQL 数据库 [root@oldboy tools]# mysql -uroot -poldboy123 #创建一个 wiki 是库 mysql> create datab ...