描述

一日,崔克茜来到小马镇表演魔法。

其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它。初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开。崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗?

输入

第一行一个整数 T (T ≤ 100)表示数据组数。 对于每组数据,第一行有两个整数 n 和 k (1 ≤ n ≤ 300, 0 ≤ k ≤ n)。 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 ai 个盒子的钥匙。

输出

对于每组询问,输出一行表示对应的答案。要求相对误差不超过四位小数。

样例输入
4
5 1
2 5 4 3 1
5 2
2 5 4 3 1
5 3
2 5 4 3 1
5 4
2 5 4 3 1
样例输出
0.000000000
0.600000000
0.900000000
1.000000000
 对于每个盒子而言有且仅有一把钥匙能打开它意味着这是若干个简单环,只需要每个环。
那么我们可以DP,设f[i][j]表示前i个环满足条件且已选了j个的方案。状态转移时需要得到组合数。
或许你会问会爆精度怎么办,因为求的是概率只需用double或long double保存就行了。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
int n,k,size[maxn],cnt,v[maxn],vis[maxn];
double f[maxn][maxn],C[maxn][maxn];
int main() {
int T=read();
C[][]=;
rep(i,,) rep(j,,i) C[i+][j+]+=C[i][j],C[i+][j]+=C[i][j];
while(T--) {
n=read();k=read();cnt=;
memset(size,,sizeof(size));
memset(vis,,sizeof(vis));
rep(i,,n) v[i]=read();
rep(i,,n) if(!vis[i]) {
cnt++;int j=i;
do size[cnt]++,vis[j]=,j=v[j];while(j!=i);
}
memset(f,,sizeof(f));
f[][]=1.0;int cur=;
rep(i,,cnt) {
rep(j,,cur) rep(k0,,size[i]) f[i+][j+k0]+=f[i][j]*C[size[i]][k0];
cur+=size[i];
}
printf("%.6lf\n",f[cnt+][k]/C[n][k]);
}
return ;
}

最新文章

  1. 在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出
  2. 引用模板中的类型时,切记要加上typename声明!!
  3. 调试SQLSERVER (一)生成dump文件的方法
  4. 【转】CDH5.x升级
  5. Swift游戏实战-跑酷熊猫 14 熊猫打滚
  6. HTML基础学习笔记
  7. andriod开发,简单的封装网络请求并监听返回.
  8. Highcharts 点击反选
  9. 我的学习之路_第三十章_servlet
  10. 第59章 IdentityServer交互服务 - Identity Server 4 中文文档(v1.0.0)
  11. SpaceSyntax【空间句法】之DepthMapX学习:第三篇 软件介绍与一般分析流程图
  12. ElasticSearch 2 (28) - 信息聚合系列之高层概念
  13. github pull request
  14. 运行python时提示:ImportError: No module named plyvel ,ImportError No module named irc 解决过程:
  15. 小甲鱼Python笔记(下)
  16. 我的Android学习路线(一)
  17. db2 sql
  18. System and method for parallel execution of memory transactions using multiple memory models, including SSO, TSO, PSO and RMO
  19. hibernate中的session的获取方法以及区别
  20. jsp 详解request对象

热门文章

  1. WiFi基本知识【转】
  2. Python3学习笔记25-logging模块
  3. ORA-01017: invalid username/password; logon denied 解决方案
  4. java中集合的组成及特点
  5. 在window是下安装hadoop过程
  6. keras + tensorflow安装
  7. windows下sublime通过sftp扩展上传文件到linux服务器上
  8. ural1989 单点更新+字符串hash
  9. pytest十二:cmd命令行参数
  10. PyCharm 新建文件时默认添加作者时间等