【pkuwc2018】随机算法
我们考虑用状压dp来解决这一道题
设$f[i][S]$表示当前排列的前i位所构成的最大独立集恰好为S的方案数
我们考虑用$f[i][S]$推出$f[i+1][S']$的值
那么我们有两种扩展的方法,一种是在第$i+1$位,加入一个数$j$,满足$S∩j=∅$,且$S∪j$为最大独立集。
这种情况,相当于在原本的最大独立集中,新加入了一个点j,那么显然可以对答案产生贡献
则有$f[i+1][S|(1<<j)]+=f[i][S]$
另一种是:我们在第i+1位,填入一个不会对最大独立集产生变化的数。
根据题意,我们要填入一个数j,满足集合S中,存在于节点$j$相邻的点。
则有$f[i+1][S]+=f[i][S]*(p[S]-i) $,其中$p[S]$表示与集合$S$相连的点的个数+集合$S$所包含的点数
设题目中所给的图的最大独立集大小为$k$
最后的答案显然为$\dfrac{\sum\limits_{|S|=k}f[n][k]}{n!}$
#include<bits/stdc++.h>
#define M 20
#define lowbit(x) ((x)&(-(x)))
#define MOD 998244353
#define L long long
using namespace std; L pow_mod(L x,L k){L ans=1; for(;k;k>>=1,x=x*x%MOD) if(k&1) ans=ans*x%MOD; return ans;} int a[M],ok[1<<M],p[1<<M],siz[1<<M];
L f[M+1][1<<M];
int n,m,U; int main(){
scanf("%d%d",&n,&m);
U=1<<n;
for(int i=1;i<U;i++) siz[i]=siz[i-lowbit(i)]+1;
for(int i=0;i<n;i++) a[i]^=(1<<i);
for(int i=1;i<=m;i++){
int x,y; scanf("%d%d",&x,&y);
x--; y--;
a[x]^=(1<<y); a[y]^=(1<<x);
}
ok[0]=1;
for(int i=0;i<U;i++)
if(ok[i]){
for(int j=0;j<n;j++)
if((i&a[j])==0)
ok[i|(1<<j)]=1;
}
int maxn=0;//最大独立集大小
for(int i=1;i<U;i++) if(ok[i]) maxn=max(maxn,siz[i]); for(int i=1;i<U;i++)
for(int j=0;j<n;j++)
if(i&a[j]) p[i]++;
//p[S] 与点集S相连的点数为多少(包括S中的点) f[0][0]=1;
for(int i=0;i<n;i++)
for(int S=0;S<U;S++)
if(f[i][S]){
f[i+1][S]=(f[i+1][S]+f[i][S]*(p[S]-i))%MOD; for(int j=0;j<n;j++)
if((S&(1<<j))==0&&ok[S|(1<<j)]){
f[i+1][S+(1<<j)]=(f[i+1][S+(1<<j)]+f[i][S])%MOD;
}
} L ans=0;
for(int S=1;S<U;S++)
if(siz[S]==maxn&&ok[S]==1)
ans=(ans+f[n][S])%MOD; L fac=1;
for(int i=1;i<=n;i++) fac=fac*i%MOD;
printf("%lld\n",ans*pow_mod(fac,MOD-2)%MOD);
}
【pkuwc2018】随机算法的更多相关文章
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- 【洛谷5492】[PKUWC2018] 随机算法(状压DP)
点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...
- LG5492 [PKUWC2018]随机算法
题意 有一种贪心求最大独立集的算法: 随机一个排列 按顺序加入独立集,如果一个点能加入,就加入\({S}\) 给出一张图,问得出正确答案的概率. \(n \leq 20\) 传送门 思路 用 \(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微信 ...
随机推荐
- Linux shell环境的配置
shell配置文件分类 按生效范围分类:全局和局部 按登录方式分类:交互式和非交互式 按功能分类:profile和bashrc shell配置文件按生效范围分类: 全局配置:针对有所用户有效 /etc ...
- Linux 文件权限相关知识
文件权限说明 Linux中的文件能否被访问和工具(程序)无关,和访问的用户身份有关(谁去运行这个程序) 进程的发起者(谁去运行这个程序). 进程的发起者若是文件的所有者: 拥有文件的属主权限 进程的发 ...
- 【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()
UI自动化中的重要工作就是元素定位了,高效精准的定位方法可以让工作事半功倍. 在过去的一段web自动化经历中,使用的selenium库支持了多种定位方法,我们可以利用这些定位方法来做进一步封装,写出符 ...
- ARCGIS API for Python进行城市区域提取
ArcGIS API for Python主要用于Web端的扩展和开发,提供简单易用.功能强大的Python库,以及大数据分析能力,可轻松实现实时数据.栅格数据.空间数据等多源数据的接入和GIS分析 ...
- linux 运行.sh出现 Permission denied
执行.sh脚本时提示如下错误: [root@Dolen2021 redis]# ./startRedis.sh -bash: ./startRedis.sh: Permission denied [r ...
- linux环境下修改网卡为eth0
如果没有在安装系统之前传递内核参数将⽹卡名称更改为eth*,则可以在安装系统后修改 vim /etc/default/grub GRUB_DEFAULT=0 GRUB_TIMEOUT_STYLE=hi ...
- ZooKeeper3.4.10集群安装配置-Docker
一. 服务器规划 主机 IP 端口 备注 b-mid-24 172.16.0.24 2181, 2888, 3888 2181:对cline端提供服务 3888:选举leader使用 2888:集群内 ...
- git 生成key并添加key(Windows)
简介 一般来说,在项目代码拉取或者提交前都需要添加项目权限,除此之外也需要将对应设备的public key添加至对应的git上,因此需要生成public key 步骤 1.安装git插件(Window ...
- 举重若轻流水行云,前端纯CSS3实现质感非凡的图片Logo鼠标悬停(hover)光泽一闪而过的光影特效
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_197 喜欢看电影的朋友肯定会注意到一个有趣的细节,就是电影出品方一定会在片头的Logo环节做一个小特效:暗影流动之间光泽一闪而过, ...
- 出票系统:根据淡旺季的月份和年龄,打印票价[课后练习] 出票系统:根据淡旺季的月份和年龄,打印票价[课后练习] 4 10旺季: 4 10旺季: 成人(18-60) : 60 成人(18-60):60 儿童(<18) :半价 儿童(<18):半价 老人(>60) :1/3 老人(>60):1/3 淡季: 淡季: 成人: 40 成人:40 其他: 20 其他:20
用if适合新手练习 package LianXiTi;import java.util.Scanner;public class first2 {// 出票系统:根据淡旺季的月份和年龄,打印票价[课后 ...