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微信 ... 
随机推荐
- C#  不是序列化xml 转实体Model【原家独创】
			public static T XmlConvertModel<T>(string xmlStr) where T : class, new() { T ... 
- ASP.NET Core 2.1 中的 HttpClientFactory (Part 1)  HttpClientFactory介绍
			原文:https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore 发表于:2018年1月 ASP.NET ... 
- gradle上传jar包到maven公共仓库
			首先这里说的中央仓库 是指的 https://issues.sonatype.org/ 而不是maven私服. 其次是使用gradle上传jar包,maven上传,网上有很多教程,这里不做赘述. 首选 ... 
- 数据结构与算法---排序算法(Sort Algorithm)
			排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进 ... 
- 使用swap扩展内存
			当系统在内存不够用的时,新建一个swap文件,这个文件可以把内存中暂时不用的传输到对应的swap文件上,相当于扩展了内存的大小,具体使用方法如下: swap文件可以自己选择放在哪里,自己新建一个对应的 ... 
- JS做动态表格
			在后台将数据发送过来后,你需要将这些数据做成表格,实现一般表格管理功能 例如这种数据格式, 首先要创建table 在table中添加thead 在thead中添加tr 循环数组,且创建开头的inpu ... 
- STM8 工程模版
			在st官网下载STM8固件库 拷贝固件库到工程目录下 再创建两个目录 user:存放用户文件.自己编写的源文件 project:存放工程文件 拷贝stm8s_conf.h到user目录下 AIR 创建 ... 
- Linux(一):Linux基础
			1. Linux入门 1.1. Linux概述 Linux是一套免费使用和自由传播的类Unix操作系统.Unix操作系统是上世纪70年代在贝尔实验室诞生的一个强大的多用户.多任务操作系统. Linux ... 
- 【转载】解密ThreadLocal
			概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资 ... 
- word中快捷键查看与设定
			很多时候,我们在编辑word文档的时候,为了快速方便都使用快捷键,常用的快捷键大家都知道,但是不常用的是不是就比较懵圈,本文就来告诉你怎么查看与设置word的快捷键. 我使用的word2016 第一步 ... 
