#1075 : 开锁魔法III
2015-09-12 10:36
363 查看
描述
一日,崔克茜来到小马镇表演魔法。其中有一个节目是开锁咒:舞台上有 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
EmacsNormalVim
对于每个盒子而言有且仅有一把钥匙能打开它意味着这是若干个简单环,只需要每个环。
那么我们可以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=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } const int maxn=310; int n,k,size[maxn],cnt,v[maxn],vis[maxn]; double f[maxn][maxn],C[maxn][maxn]; int main() { int T=read(); C[0][0]=1; rep(i,0,300) rep(j,0,i) C[i+1][j+1]+=C[i][j],C[i+1][j]+=C[i][j]; while(T--) { n=read();k=read();cnt=0; memset(size,0,sizeof(size)); memset(vis,0,sizeof(vis)); rep(i,1,n) v[i]=read(); rep(i,1,n) if(!vis[i]) { cnt++;int j=i; do size[cnt]++,vis[j]=1,j=v[j];while(j!=i); } memset(f,0,sizeof(f)); f[1][0]=1.0;int cur=0; rep(i,1,cnt) { rep(j,0,cur) rep(k0,1,size[i]) f[i+1][j+k0]+=f[i][j]*C[size[i]][k0]; cur+=size[i]; } printf("%.6lf\n",f[cnt+1][k]/C [k]); } return 0; }
View Code
相关文章推荐
- hdu 1020 Encoding
- ajax(1)
- 「两个指针的应用」最短摘要的生成
- android selector(转)
- 数据库心得体会
- Delphi和JAVA用UTF-8编码进行Socket通信例子
- javascript判断网页是关闭还是刷新
- 个人学习笔记---linux内核同步
- 以实例讲解Objective-C中的KVO与KVC机制
- 数据挖掘(9):BP神经网络算法与实践
- Delphi XE4,C++ Builder XE4,RAD Studio XE4 v18.0.4905.60485(With Update 1) 官方下载激活
- Remove Element
- Über-shader与deferred shading
- 软件工程的实践项目的自我目标
- Invoke
- 【hdu5304】生成树计数—基尔霍夫矩阵 DP
- CSS小贴士(垂直居中和百分比下调整盒模型填充)
- 数据挖掘(8):朴素贝叶斯分类算法原理与实践
- 位运算及其应用详解
- Remove Duplicates from Sorted Array