题意:小朋友有N个盒子,每个盒子装着打开第ai个盒子的钥匙,小朋友一开始可以使用洪荒之力打开k个盒子,求他能开完所有盒子的概率

题解:

DP+组合数

首先几个盒子通过多次打开一定会形成一个环,设每个环的盒子数为cnt[i]

状态:dp[i][j]表示前i个盒子用j个钥匙打开的方案数

转移:dp[i+1][j+k]=∑dp[i][j]*C[cnt[i]][k]

ps:dp数组和C数组要开double,double的上界大约可以到1*10^308(汗)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;const int N = 310;int T,n,m,cnt[N],a[N];
double dp[N][N],c[N][N];
bool vis[N];int gi() {int x=0,o=1; char ch=getchar();while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') o=-1,ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return o*x;
}void pre() {c[0][0]=1.0;for(int i=1; i<=300; i++) {c[i][0]=c[i][i]=1;for(int j=1; j<i; j++)c[i][j]=c[i-1][j]+c[i-1][j-1];}
}int main() {pre();int T=gi();while(T--) {memset(cnt,0,sizeof(cnt));memset(dp,0,sizeof(dp));memset(vis,0,sizeof(vis));int n=gi(),m=gi(),tmp;for(int i=1; i<=n; i++) a[i]=gi();for(int i=1; i<=n; i++) {if(vis[i]) continue;vis[i]=1,tmp=a[i],cnt[++cnt[0]]=1;while(!vis[tmp]) cnt[cnt[0]]++,vis[tmp]=1,tmp=a[tmp];}dp[0][0]=1.0;for(int i=1; i<=cnt[0]; i++)for(int j=0; j<=m; j++)for(int k=1; j+k<=m && k<=cnt[i]; k++) dp[i][j+k]+=dp[i-1][j]*c[cnt[i]][k];printf("%.4f\n", dp[cnt[0]][m]/c[n][m]);}return 0;
}

转载于:https://www.cnblogs.com/HLXZZ/p/7528256.html

[hihocoder 1075] 开锁魔法III相关推荐

  1. hihocoder 1075 : 开锁魔法III

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

  2. JavaScript|拖拽|仿Android手机九点连线开锁

    最简单的JavaScript拖动代码 <script> var xx=0,yy=0; function a(v) { xx=event.x-v.offsetLeft; yy=event.y ...

  3. iphone开蓝牙wifi上网慢_为啥我开锁总是比别人慢?

    说起手机的蓝牙功能,大家都不陌生,在还没有wifi,网速超级慢,流量也贵得害怕的年代. 蓝牙传送是两台手机之间传输文件最快也最方便的方式,堪称当年手机界的"黑科技"功能.多年过去后 ...

  4. c语言线程锁的原理开锁原理图,C++多线程之可重入锁

    #include #include #include using namespace std; recursive_mutex re; void task1() { re.lock(); cout & ...

  5. 登陆 manager app显示不是私密链接_小米上线了一款靠指静脉识别开锁的私密箱,打造你的私人存储空间...

    印象中的保险箱体积大.价格昂贵.开锁繁琐,一直都认为那是企业老板.成功人士的标配,对于普通家庭来说存在的价值.或实用性方面并不是很高.往常遇到长时间外出旅行,也会担心家里重要的证件.首饰等贵重物品的安 ...

  6. 哈罗单车打不开锁,显示:“可能卡住了 重新开锁”

    点重新开锁,同时亲手去拉单车的锁把子,助它打开 . 转载于:https://www.cnblogs.com/shuangfeike/p/11470945.html

  7. 基于Arduino的无接触式智能门锁(RFID和蓝牙开锁)

    一.简单介绍 本项目基于Arduino开发,支持刷卡(复旦卡)和蓝牙串口密码发送两种方式,支持舵机和继电器(可接电磁锁等)两种开锁方式.详情见代码,代码注释很全的. 文章末尾附源程序.库文件.3D打印 ...

  8. 实训9——蓝牙修改开锁密码

    实训九 : 蓝牙修改开锁密码 一.实验目的 通过ESP32,按键模块和SG90舵机,实现蓝牙发送相应的命令修改按键密码 二.实验内容 1.连接ESP32和按键模块的引脚,以及ESP32和SG90舵机的 ...

  9. 【文末有福利! 】刷脸开锁:背后的技术绝招

    安全君在去年向大家介绍了智能语义安全检测的武林(链接:https://m.aliyun.com/yunqi/articles/66859).今年,有另一大绝招在江湖上兴起:实人认证. 1 且说苦练实人 ...

最新文章

  1. iOS 之 IQKeyboardManager 解决使用UITableView 界面上移问题
  2. 阿里p7程序员哀叹:35岁,被通知合同不再续签,输出社会,怎么办?
  3. VMware10 —— 安装CentOS7(图解)
  4. mysql5.7.19 创建用户_mysql5.7.19用户的创建和权限的操作
  5. Spring Boot application.yml文件语法
  6. 【重难点】【Java基础 07】变量类型、内部类、处理器指令优化
  7. 3层vni vxlan_什么是VXLAN 三层网络搭建二层网络的设计方案
  8. D3D 光照和材料 小样例
  9. Ubuntu创建快捷方式
  10. Disruptor(无锁并发框架)-发布
  11. ueditor html模板,UEditor 编辑模板
  12. php opendir 不能用,php opendir()函数讲解及遍历目录实例
  13. 云宏WinCloud助力银行业务快速入云
  14. Visual Question Answering: Datasets, Algorithms, and Future Challenges文章翻译
  15. 操作系统教程课后习题答案完整版
  16. 构建 WCF 路由器 part 2 from MSDN
  17. 全民养猪(手机游戏 攻略)
  18. 4.1黄金原油今日价格走势分析#白银TD趋势行情操作建议
  19. python bootstrap安装_Django配置Bootstrap, js实现过程详解
  20. Linux环境Tomcat运行报错java.lang.OutOfMemoryError

热门文章

  1. ICLR 6-6-6!自注意力可以替代CNN,能表达任何卷积滤波层
  2. SAP 如何从表中区分内外向交货单
  3. 算法面试的理想与现实
  4. 初学者 | 一文读懂命名实体识别
  5. 隆重介绍!一款新型基于姿势的人像实例分割框架
  6. 大众高层:中国将成为全球自动驾驶软件研发中心
  7. 2019年值得关注的人工智能技术的五大趋势
  8. scipy.sparse.coo_matrix、csr_matrix、lil_matrix、dia_matrix
  9. IEEE年终AI大盘点:网友教会GPT-3骂人、DeepMind再造机器人
  10. 2020年中国新基建产业报告(收藏)