hihocoder1075【开锁魔法】
hihocoder1075【开锁魔法】
题意是给你一个 \(1~n\) 的置换,求选 \(k\) 个可以遍历所有点的概率。
题目可以换个模型:有 \(n\) 个球,有 \(cnt\) 种不同的颜色,求选出 \(k\) 个球包含所有颜色的概率。
根据概率的定义,我们只需求出合法的方案数即可。
设 \(f[i][j]\) 表示选 \(j\) 个球,包含前 \(i\) 种颜色的方案数。转移枚举第 \(i\) 种颜色选的个数即可。
根据乘法原理和加法原理可得:
\]
初始条件是 \(f[0][0]=1\),结果是 \(f[cnt][k]/c[n][k]\)。
#include <bits/stdc++.h>
using namespace std;
#define db double
#define ll long long
#define RG register
inline int gi()
{
RG int ret; RG bool flag; RG char ch;
ret=0, flag=true, ch=getchar();
while (ch < '0' || ch > '9')
ch == '-' ? flag=false : 0, ch=getchar();
while (ch >= '0' && ch <= '9')
ret=(ret<<3)+(ret<<1)+ch-'0', ch=getchar();
return flag ? ret : -ret;
}
const db pi = acos(-1.0);
const int N = 305, inf = 1<<30;
db c[N][N],f[N][N];
int to[N],a[N];
bool vis[N];
int main()
{
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
int T,n,m,i,j,p,cnt;
for (i=1; i<N; ++i)
{
c[i][0]=c[i][i]=1;
for (j=1; j<i; ++j)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
T=gi();
while (T--)
{
n=gi(), m=gi(), cnt=0;
for (i=1; i<=n; ++i)
{
vis[i]=false, a[i]=0;
for (j=0; j<=m; ++j)
f[i][j]=0;
}
for (i=1; i<=n; ++i)
to[i]=gi();
for (i=1; i<=n; ++i)
{
if (vis[i])
continue;
p=i, cnt++;
while (!vis[p])
a[cnt]++, vis[p]=true, p=to[p];
}
if (m < cnt)
{
puts("0.00000000000");
continue;
}
f[0][0]=1;
for (i=0; i<=cnt; ++i)
for (j=0; j<m; ++j)
{
if (f[i][j] == 0)
continue;
for (p=1; p<=a[i+1] && p+j <= m; ++p)
f[i+1][j+p]+=f[i][j]*c[a[i+1]][p];
}
printf("%.9f\n",f[cnt][m]/c[n][m]);
}
return 0;
}
hihocoder1075【开锁魔法】的更多相关文章
- hrb——开锁魔法I——————【规律】
解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ...
- hihocoder 1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- #1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- Hiho #1075: 开锁魔法III
Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...
- HihoCoder 1075 开锁魔法III(概率DP+组合)
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- hihoCode 1075 : 开锁魔法III
时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...
- BZOJ 5004: 开锁魔法II 期望 + 组合
Description 题面:www.lydsy.com/JudgeOnline/upload/task.pdf Input Output 一般概率题有两种套路: 满足条件的方案/总方案. 直接求概率 ...
- bzoj5003: 与链 5004: 开锁魔法II 5005:乒乓游戏
www.lydsy.com/JudgeOnline/upload/task.pdf 第一题题意可以转为选一个长度k的序列,每一项二进制的1的位置被下一项包含,且总和为1,考虑每个二进制位的出现位置,可 ...
- 【bzoj5004】开锁魔法II 组合数学+概率dp
题目描述 有 $n$ 个箱子,每个箱子里有且仅有一把钥匙,每个箱子有且仅有一把钥匙可以将其打开.现在随机打开 $m$ 个箱子,求能够将所有箱子打开的概率. 题解 组合数学+概率dp 题目约定了每个点的 ...
随机推荐
- 【经验】使用Profiler工具分析内存占用情况
Unity3D为我们提供了一个强大的性能分析工具Profiler.今天我们就使用Profiler来具体分析一下官方样例AngryBots的内存使用信息数据. 首先打开Profiler选择Memory选 ...
- SQL Server常用系统表
1.查询当前数据库中的用户表 select *from sysobjects where xtype='U'; 2.获取SQL Server允许同时用户连接的最大数 SELECT @@MAX_CONN ...
- solr入门之pinyin4j源代码改写动态加入扩展词及整合进war项目中
1.初始化时载入用户定义的字典 package net.sourceforge.pinyin4j; import net.sourceforge.pinyin4j.multipinyin.Trie; ...
- 前端PC页面,移动端页面问题笔记~~
<!DOCTYPE html> <html> <head> <meta charset="gbk"/> <meta name= ...
- An easy to use android color picker library
https://github.com/xdtianyu/ColorPicker
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- spring整合hibernate,在获取sessionFactory的时候报错,求解决办法!!
applicationContext.xml文件 <!-- 开启扫包 --> <context:component-scan base-package="cn.edu&qu ...
- 【Selenium+Python Webdriver】报错之:TypeError: user_login() missing 1 required positional argument: 'self'
先贴一下源码: base.py文件如下: from selenium import webdriver class Page(object): ''' 页面基础类,用于所有页面的继承 ''' rb_u ...
- Quart 2D 绘制图形简单总结(转)
0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGConte ...
- 远程访问(post 传参数) 以及IOUtils复制文件
package com.action; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream ...