hihocoder 1075 : 开锁魔法III
描述
一日,崔克茜来到小马镇表演魔法。
其中有一个节目是开锁咒:舞台上有 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相关推荐
- [hihocoder 1075] 开锁魔法III
题意:小朋友有N个盒子,每个盒子装着打开第ai个盒子的钥匙,小朋友一开始可以使用洪荒之力打开k个盒子,求他能开完所有盒子的概率 题解: DP+组合数 首先几个盒子通过多次打开一定会形成一个环,设每个环 ...
- JavaScript|拖拽|仿Android手机九点连线开锁
最简单的JavaScript拖动代码 <script> var xx=0,yy=0; function a(v) { xx=event.x-v.offsetLeft; yy=event.y ...
- iphone开蓝牙wifi上网慢_为啥我开锁总是比别人慢?
说起手机的蓝牙功能,大家都不陌生,在还没有wifi,网速超级慢,流量也贵得害怕的年代. 蓝牙传送是两台手机之间传输文件最快也最方便的方式,堪称当年手机界的"黑科技"功能.多年过去后 ...
- c语言线程锁的原理开锁原理图,C++多线程之可重入锁
#include #include #include using namespace std; recursive_mutex re; void task1() { re.lock(); cout & ...
- 登陆 manager app显示不是私密链接_小米上线了一款靠指静脉识别开锁的私密箱,打造你的私人存储空间...
印象中的保险箱体积大.价格昂贵.开锁繁琐,一直都认为那是企业老板.成功人士的标配,对于普通家庭来说存在的价值.或实用性方面并不是很高.往常遇到长时间外出旅行,也会担心家里重要的证件.首饰等贵重物品的安 ...
- 哈罗单车打不开锁,显示:“可能卡住了 重新开锁”
点重新开锁,同时亲手去拉单车的锁把子,助它打开 . 转载于:https://www.cnblogs.com/shuangfeike/p/11470945.html
- 基于Arduino的无接触式智能门锁(RFID和蓝牙开锁)
一.简单介绍 本项目基于Arduino开发,支持刷卡(复旦卡)和蓝牙串口密码发送两种方式,支持舵机和继电器(可接电磁锁等)两种开锁方式.详情见代码,代码注释很全的. 文章末尾附源程序.库文件.3D打印 ...
- 实训9——蓝牙修改开锁密码
实训九 : 蓝牙修改开锁密码 一.实验目的 通过ESP32,按键模块和SG90舵机,实现蓝牙发送相应的命令修改按键密码 二.实验内容 1.连接ESP32和按键模块的引脚,以及ESP32和SG90舵机的 ...
- 【文末有福利! 】刷脸开锁:背后的技术绝招
安全君在去年向大家介绍了智能语义安全检测的武林(链接:https://m.aliyun.com/yunqi/articles/66859).今年,有另一大绝招在江湖上兴起:实人认证. 1 且说苦练实人 ...
最新文章
- openstack e版创建instance整个流程
- Keepalived简介
- SpringCloud Ribbon(六)之服务实例过滤器ServerListFilter
- ACM - 欧拉函数(内容)
- Servlet全面讲解
- 插入数据的时候出现错误:Error during job, obtaining debugging information…
- Controller中请求数据的方式
- docker使用问题总结
- qt翻译--QDragMoveEvent拖放类
- java实验报告心得_Java实验报告(一)及总结
- html模拟终端,超级终端连续ping
- 草图大师(SketchUp Pro 2019)多语言 永久启用教程
- Kinect v2(Microsoft Kinect for Windows v2 )配置移动电源解决方案
- 程序员必备的七个电脑软件
- [C++] 麻将胡牌算法
- 2022深圳限行一年几次免罚 有几次机会
- 视频网站存储在服务器,网络视频存储服务器
- R语言while循环计算圆周率
- soot基础 -- soot中基本的对象
- ACPI中各种state的关系
热门文章
- spark重要参数调优建议:spark.default.parallelism设置每个stage默认的task数量
- win10 docker desktop无法拉取镜像解决办法
- JVM 的内存模型及jstat命令的使用
- lombok @Builder注解的使用
- matlab rebit,BIM的算法最新消息!MATLAB被禁也有BIM开源工具用!
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
- paddlepaddle测试安装_PaddlePaddle升级解读 | 十余行代码完成迁移学习,PaddleHub实战篇...
- h3c GR5200路由器上如何设置公网ip可以访问
- MATLAB有关数字信号处理的一些方法
- matlab中如何添加注释