【LOJ2540】「PKUWC2018」随机算法
题意
给一个 \(n\) 个点 \(m\) 条边的无向图。考虑如下求独立集的随机算法:随机一个排列并按顺序加点。如果当前点能加入独立集就加入,否则不加入。求该算法能求出最大独立集的概率。
\(n\le 20\)。
Solution
考虑状压DP。按照题意我们按顺序加点,如果该点不能加入独立集,那么这个点可以插在之后排列的某一个位置中。
我们记当前排列独立集中的点的集合和不在独立集中的点的个数为状态,设 \(F(S,i)\) 表示当前独立集点的集合为 \(S\),还有 \(i\) 个点没有插入排列。
可以用高维前缀和预处理每个集合的相邻的点(包括集合本身的点。记为 \(g(S)\)),这样就可以 \(O(2^n \times n^2)\) 的预处理每个点 \(u\) 当前集合加入独立集 \(s\) 后新的相邻的点,记为 \(h(u,S)\)。
我们有
F(S\cup u,i+h(u,S)) \leftarrow F(S,i) (u\notin g(S))
\]
DP 的时间复杂度是 \(O(2^n \times n^2)\)。可以通过本题。当然这不是本题的最优复杂度。
code
#include<bits/stdc++.h>
#pragma GCC target("popcnt")
using namespace std;
const int N=21,Mod=998244353;
int g[1<<N],f[1<<N][N],t[N],ans,mx,n,m;
void upd(int& x, int y)
{
x=(x+y>=Mod?x+y-Mod:x+y);
}
#define mul(x,y) (1ll*(x)*(y)%Mod)
inline int po(int x, int y=Mod-2)
{
int r=1;
while(y)
{
if(y&1) r=mul(r,x);
x=mul(x,x), y>>=1;
}
return r;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;++i)
{
scanf("%d%d",&u,&v),--u,--v;
g[1<<u]|=(1<<u)|(1<<v);
g[1<<v]|=(1<<u)|(1<<v);
}
for(int s=1;s<(1<<n);++s)
for(int i=0;i<n;++i) if(s&(1<<i)) g[s]|=g[s^(1<<i)];
f[0][0]=1;
for(int s=0;s<(1<<n);++s)
{
for(int i=n;i;--i) upd(f[s][i-1],mul(f[s][i],i));
memset(t,0,sizeof(t));
for(int x=0;x<n;++x) if(!(g[s]&(1<<x)))
t[x]=__builtin_popcount((g[1<<x]^(1<<x))&(~g[s]));
for(int i=0;i<=n;++i) if(f[s][i])
for(int x=0;x<n;++x) if(!(g[s]&(1<<x)))
upd(f[s|(1<<x)][i+t[x]],f[s][i]);
}
for(int s=0;s<(1<<n);++s)
{
const int cnt=__builtin_popcount(s);
if(cnt>mx&&f[s][0]) mx=cnt,ans=f[s][0];
else if(cnt==mx) upd(ans,f[s][0]);
}
int fac=1; for(int i=1;i<=n;++i) fac=mul(fac,i);
printf("%d",mul(ans,po(fac)));
}
【LOJ2540】「PKUWC2018」随机算法的更多相关文章
- loj2540 「PKUWC2018」随机算法 【状压dp】
题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i] ...
- LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】
LINK 思路 首先在加入几个点之后所有的点都只有三种状态 一个是在独立集中,一个是和独立集联通,还有一个是没有被访问过 然后前两个状态是可以压缩起来的 因为我们只需要记录下当前独立集大小和是否被访问 ...
- LOJ2540「PKUWC2018」随机算法
又是一道被咕了很久的题 貌似从WC2019之前咕到了现在 我们用f[i][s]表示现在最大独立集的大小为i 不可选集合为s 然后转移O(n)枚举加进来的点就比较简单啦 这个的复杂度是O(2^n*n^2 ...
- 「PKUWC2018」随机算法
题目 思博状压写不出是不是没救了呀 首先我们直接状压当前最大独立集的大小显然是不对的,因为我们的答案还和我们考虑的顺序有关 我们发现最大独立集的个数好像不是很多,可能是\(O(n)\)级别的,于是我们 ...
- 【LOJ】 #2540. 「PKUWC2018」随机算法
题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...
- loj#2540. 「PKUWC2018」随机算法
传送门 完了pkuwc咋全是dp怕是要爆零了-- 设\(f(S)\)表示\(S\)的排列数,\(S\)为不能再选的点集(也就是选到独立集里的点和与他们相邻的点),\(mx(S)\)表示\(S\)状态下 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
- LOJ2542. 「PKUWC2018」随机游走
LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...
随机推荐
- 路由器安全-FPM
1.FPM(也叫NGACL) FPM是Cisco IOS新一代的ACL,叫做Flexible Packet Matching,灵活的包匹配. 根据任意条件,无状态的匹配数据包的头部,负载,或者全部. ...
- ES-elasticsearch安装-linux
(1)安装JDK(ES是使用java开发的) (2)安装ES(虚拟机内存大于一个g) 1)创建普通用户启动 2)非常占用内存(默认1个g的内存) (3)创建一个普通用户(用于启动ES) groupad ...
- Jmeter 如何发起一个Get请求
举例平台:https://www.juhe.cn/docs/api/id/65 前提条件: 1)要在聚合网站注册实名认证才可以收到Key,用于Get请求的参数数值 2)Jmeter本地安装好 3.这是 ...
- 后端——框架——持久层框架——Mybatis——《Mybatis从入门到精通》读书笔记——初篇
1.Mybatis知识点 框架的知识点大致可以分为三个部分 基础: 介绍编写增,删,改,查: 动态标签: config配置文件 Mapper配置文件 插件:常见的插件有三个 pageHelper:分页 ...
- 【译】高级T-SQL进阶系列 (二)【下篇】:使用 APPLY操作符
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 使用OUTER APPLY 操作符 OUTER APPLY操作符工作起来和CROSS APPLY比较类似.唯一的 ...
- C++11常用特性介绍——左值引用、右值引用
一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...
- Centos610安装Oracle
官方安装参考 第一部分 依赖包 依赖包安全前先桌面安装 安装依赖包 yum -y install gcc gcc-c++ make binutils compat-libstdc++-33 elfut ...
- springboot集成拦截器
一.首先对HandlerInterceptor进行封装,封装为MappingInterceptor.封装的方法里添加拦截器起作用的路径addPathPatterns(),及需要排除路径的方法exclu ...
- Docker 之registry私有仓库搭建
Docker 之registry私有仓库搭建 官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/reposito ...
- Weka算法算法翻译(部分)
目录 Weka算法翻译(部分) 1. 属性选择算法(select attributes) 1.1 属性评估方法 1.2 搜索方法 2. 分类算法 2.1 贝叶斯算法 2.2 Functions 2.3 ...