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

解题报告:
用时:20min,1A
我们按\(i\)到\(ai\)连边发现,在同一环内的我们选取任意一个即可
所以我们统计这样的连通子图的个数\(m\),即每一个子图的节点数,所以我们只要保证每一个子图至少选到一个即可,所以我们DP方案数:
\(f[i][j]\)表示前i个子图中选了j个点的方案数
\(f[i][j]+=f[i-1][j-l]*c[s[i]][l]\)
\(s[i]\)表示i这个子图的大小,c为组合数,这里我么要保证每一个至少都选一个那就限制j-l>=i-1即可,最后答案就是\(f[m][k]/c[n][k]\)

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=3e2+5;
int n,k,s[N],m=0,a[N];double f[N][N],c[N][N];bool vis[N];
void prework(){for(int i=0;i<N;i++){c[i][0]=1;for(int j=1;j<=i;j++)c[i][j]=c[i-1][j-1]+c[i-1][j];}
}
void work()
{m=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i]),vis[i]=false;int x,t=0;for(int i=1;i<=n;i++){if(vis[i])continue;x=i;t=0;while(!vis[x]){vis[x]=true;x=a[x];t++;}s[++m]=t;}memset(f,0,sizeof(f));f[0][0]=1;for(int i=1;i<=m;i++){for(int j=1;j<=k;j++)for(int l=1;l<=s[i] && j-l>=i-1;l++){f[i][j]+=f[i-1][j-l]*c[s[i]][l];}}double ans=(double)f[m][k]/(c[n][k]*1.0);printf("%.4lf\n",ans);
}int main()
{int T;cin>>T;prework();while(T--)work();return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/7517881.html

hihocoder 1075 : 开锁魔法III相关推荐

  1. [hihocoder 1075] 开锁魔法III

    题意:小朋友有N个盒子,每个盒子装着打开第ai个盒子的钥匙,小朋友一开始可以使用洪荒之力打开k个盒子,求他能开完所有盒子的概率 题解: DP+组合数 首先几个盒子通过多次打开一定会形成一个环,设每个环 ...

  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. openstack e版创建instance整个流程
  2. Keepalived简介
  3. SpringCloud Ribbon(六)之服务实例过滤器ServerListFilter
  4. ACM - 欧拉函数(内容)
  5. Servlet全面讲解
  6. 插入数据的时候出现错误:Error during job, obtaining debugging information…
  7. Controller中请求数据的方式
  8. docker使用问题总结
  9. qt翻译--QDragMoveEvent拖放类
  10. java实验报告心得_Java实验报告(一)及总结
  11. html模拟终端,超级终端连续ping
  12. 草图大师(SketchUp Pro 2019)多语言 永久启用教程
  13. Kinect v2(Microsoft Kinect for Windows v2 )配置移动电源解决方案
  14. 程序员必备的七个电脑软件
  15. [C++] 麻将胡牌算法
  16. 2022深圳限行一年几次免罚 有几次机会
  17. 视频网站存储在服务器,网络视频存储服务器
  18. R语言while循环计算圆周率
  19. soot基础 -- soot中基本的对象
  20. ACPI中各种state的关系

热门文章

  1. spark重要参数调优建议:spark.default.parallelism设置每个stage默认的task数量
  2. win10 docker desktop无法拉取镜像解决办法
  3. JVM 的内存模型及jstat命令的使用
  4. lombok @Builder注解的使用
  5. matlab rebit,BIM的算法最新消息!MATLAB被禁也有BIM开源工具用!
  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
  7. paddlepaddle测试安装_PaddlePaddle升级解读 | 十余行代码完成迁移学习,PaddleHub实战篇...
  8. h3c GR5200路由器上如何设置公网ip可以访问
  9. MATLAB有关数字信号处理的一些方法
  10. matlab中如何添加注释