LG5492 [PKUWC2018]随机算法
题意
有一种贪心求最大独立集的算法:
- 随机一个排列
- 按顺序加入独立集,如果一个点能加入,就加入\({S}\)
给出一张图,问得出正确答案的概率。
\(n \leq 20\)
思路
用 \(dp[i][s]\) 表示排列集合为 \(i\),最大独立集的大小为 \(s\) 的方案数,\(a[x]\)表示与\(x\)相连的点集。
考虑加入一个可行点,会使与它相连的所有点不能再加入,这些点的排列顺序无关答案,可以直接将他们随便放到后面的排列中去,即乘上\(A(n-count[i]-1,count[a[j]]-count[i \& a[j]]-1)\),将这些点看作已经在排列里了,继续转移
因为对于一个排列集合,我们只需要转移\(s\)最大的即可(小的不可能成为答案),所以复杂度是\(O(n \times 2^n)\)的
#include <bits/stdc++.h>
const int mu=998244353;
int p[25],inv[25],dp[1<<20][21],a[20],n,m,count[1<<20],x,y;
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=x*1ll*x%mu)
if (y&1) ans=ans*1ll*x%mu;
return ans;
}
int A(int x,int y){
return 1ll*p[x]*inv[x-y]%mu;
}
void init(){
p[0]=1;
for (int i=1;i<=20;i++) p[i]=p[i-1]*1ll*i%mu;
inv[20]=ksm(p[20],mu-2);
for (int i=20;i>=0;i--) inv[i-1]=inv[i]*1ll*i%mu;
for (int i=1;i<1<<n;i++)
count[i]=count[i>>1]+(i&1);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) a[i]|=(1<<i);
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
x--,y--;
a[x]|=(1<<y),a[y]|=(1<<x);
}
init();
dp[0][0]=1;
for (int i=0;i<(1<<n)-1;i++)
for (int k=count[i];k>=0;k--){
int t=dp[i][k];
if (!t) continue;
for (int j=0;j<n;j++){
if (i&(1<<j)) continue;
int u=i|a[j];
dp[u][k+1]=(dp[u][k+1]+t*1ll*A(n-count[i]-1,count[a[j]]-count[i&a[j]]-1))%mu;
}
break;
}
for (int i=n;i>=1;i--)
if (dp[(1<<n)-1][i]){
printf("%d\n",dp[(1<<n)-1][i]*1ll*inv[n]%mu);
return 0;
}
}
后记
为什么我有点迷糊pku的难度??今年sc是迷惑行为吗??
LG5492 [PKUWC2018]随机算法的更多相关文章
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- 【洛谷5492】[PKUWC2018] 随机算法(状压DP)
点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...
- 题解-PKUWC2018 随机算法
Problem loj2540 题意简述:给定\(n\)个点的无向图,给定求最大独立集的近似算法:随机排列\(1\cdots n\),按照该排列顺序贪心构造最大独立集(即对每个点能加入独立集就加),求 ...
- LOJ2540 [PKUWC2018] 随机算法 【状压DP】
题目分析: 听说这题考场上能被$ O(4^n) $的暴力水过,难不成出题人是毕姥爷? 首先思考一个显而易见的$ O(n^2*2^n) $的暴力DP.一般的DP都是考虑最近的加入了哪个点,然后删除后递归 ...
- LOJ2540 PKUWC2018 随机算法 状压DP
传送门 两种$DP$: ①$f_{i,j}$表示前$i$次选择,最大独立集为$j$时达到最大独立集的方案总数,转移:$a.f_{i,j}+=f_{i+1,j+2^k}$(保证$k$加入后符合条件):$ ...
- [LOJ2540] [PKUWC2018] 随机算法
题目链接 LOJ:https://loj.ac/problem/2540 Solution 写的时候脑子不太清醒码了好长然后时间\(LOJ\)垫底... 反正随便状压\(dp\)一下就好了,设\(f[ ...
- [LOJ#2540][PKUWC2018]随机算法(概率DP)
场上数据很水,比较暴力的做法都可以过90分以上,下面说几个做法. 1. 暴力枚举所有最大独立集,对每个独立集分别DP.复杂度玄学,但是由于最大独立集并不多,所以可以拿90. 2. dp[S][k]表示 ...
- 【LOJ2540】「PKUWC2018」随机算法
题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...
- 微信红包中使用的技术:AA收款+随机算法
除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...
随机推荐
- ajax中的事件
blur : 当光标移开时(点击)触发 change : 当光标移开并且文本框中的内容和上一次不一致时(点击)触发
- Questasim10.6c下载安装教程
questasim作为modelsim的高级版,用着速度还是比modelsim爽很多,基本上所有操作指令都是和modelsim兼容的. 不同版本的vivado兼容的modelsim版本是不一样的,如果 ...
- pycharm中文乱码
python2默认不支持中文,python3支持中文,所以使用python2要注意. 解决方案: 顶部声明一下是utf8编码即可, # encoding=utf8
- Linux命令——tac、rev
tac和rev命令列到一起,并不是功能相似,而是他们都是将输入内容反置. tac -s:使用指定字符串代替换行作为分隔标志 [root@localhost ~]# echo "1,2&quo ...
- zookeeper服务【-】windows安装与liunx安装
windows安装zookeeper-3.4.14 https://www.apache.org/dyn/closer.cgi/zookeeper/ [zookeeper下载地址] 1.开启服务之前需 ...
- Song Form
First of all, song form is an indepentent concept from the boxes, boxes simply describe the way the ...
- K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)
背景 许多存储系统提供了创建存储卷“快照”(snapshot)的能力,以防止数据丢失.快照可以替代传统的备份系统来备份和还原主要数据和关键数据.快照能够快速备份数据(例如,创建GCE PD快照仅需 ...
- lua游戏开发易错踩坑录
一.local local函数一定要在调用之前定义(切记,不然会报错或者不能调用该函数) 情况1:监听调此函数后定义 base.model:addlistener("被监听的函数" ...
- go mod使用
GO111MODULE 有三个值:off, on和auto(默认值) GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者G ...
- seo与python大数据结合给文本分词并提取高频词
最近研究seo和python如何结合,参考网上的一些资料,写的这个程序. 目的:分析某个行业(例如:圆柱模板)用户最关心的一些词,根据需求去自动调整TDK,以及栏目,内容页的规划 使用方法: 1.下载 ...