P4321-随机漫游【状压dp,数学期望,高斯消元】
正题
题目链接:https://www.luogu.com.cn/problem/P4321
题目大意
给出\(n\)个点\(m\)条边的一张无向图,\(q\)次询问。
每次询问给出一个点集和一个起点,求从起点出发随机游走经过所有点集的期望步数。
\(n\in[1,18],m\in[1,\frac{n(n-1)}{2}],q\in[1,10^5]\)
解题思路
首先\(n\)很小可以状压经过点的状态,然后因为这个询问是给出起始状态所以需要倒推。设\(f_{s,x}\)表示目前状态是\(s\),在点\(x\),覆盖所有点的期望次数。
那么有方程
\]
然后\(S\)不同的当常数,相同的高斯消元转移即可。
时间复杂度\(O(2^nn^3)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=19,M=1e5+10,P=998244353;
ll n,m,q,inv[M],deg[N],a[N][N],f[1<<N][N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
namespace G{
ll a[N][N],b[N];
void clear(){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
return;
}
void solve(ll *f){
for(ll i=1;i<=n;i++){
ll p=i;
for(ll j=i;j<=n;j++)
if(a[j][i]){p=j;break;}
swap(a[i],a[p]);swap(b[i],b[p]);
ll inv=power(a[i][i],P-2);
for(ll j=i;j<=n;j++)
a[i][j]=a[i][j]*inv%P;
b[i]=b[i]*inv%P;
for(ll j=i+1;j<=n;j++){
int rate=P-a[j][i];
for(ll k=i;k<=n;k++)
a[j][k]=(a[j][k]+a[i][k]*rate%P)%P;
b[j]=(b[j]+b[i]*rate%P)%P;
}
}
for(ll i=n;i>=1;i--){
for(ll j=i+1;j<=n;j++)
b[i]=(b[i]-a[i][j]*b[j]%P+P)%P;
f[i]=b[i];
}
return;
}
}
signed main()
{
scanf("%lld%lld",&n,&m);inv[1]=1;
for(ll i=2;i<=m;i++)
inv[i]=P-(P/i)*inv[P%i]%P;
for(ll i=1;i<=m;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
a[x][y]++;a[y][x]++;
deg[x]++;deg[y]++;
}
ll MS=(1<<n);
for(ll s=MS-2;s>=0;s--){
G::clear();
for(ll i=1;i<=n;i++)
if((s>>i-1)&1)G::a[i][i]=P-1,G::b[i]=P-1;
for(ll i=1;i<=n;i++){
if(!((s>>i-1)&1))continue;
for(ll j=1;j<=n;j++){
if(!a[i][j])continue;
if((s|(1<<j-1))==s)
(G::a[i][j]+=inv[deg[i]])%=P;
else (G::b[i]+=P-inv[deg[i]]*f[s|(1<<j-1)][j]%P)%=P;
}
}
G::solve(f[s]);
}
scanf("%lld",&q);
while(q--){
ll m,s=0,x;scanf("%lld",&m);
for(ll i=1;i<=m;i++)
scanf("%lld",&x),s|=(1<<x-1);
scanf("%lld",&x);
printf("%lld\n",f[(MS-1-s)|(1<<x-1)][x]);
}
return 0;
}
P4321-随机漫游【状压dp,数学期望,高斯消元】的更多相关文章
- BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3074 Solved: 1599 [Submit][Sta ...
- UVa 10828 Back to Kernighan-Ritchie (数学期望 + 高斯消元)
题意:给定一个 n 个结点的有向图,然后从 1 结点出发,从每个结点向每个后继结点的概率是相同的,当走到一个没有后继结点后,那么程序终止,然后问你经过每个结点的期望是次数是多少. 析:假设 i 结点的 ...
- 【BZOJ】1076: [SCOI2008]奖励关(状压dp+数学期望)
http://www.lydsy.com/JudgeOnline/problem.php?id=1076 有时候人蠢还真是蠢.一开始我看不懂期望啊..白书上其实讲得很详细的,什么全概率,全期望(这个压 ...
- BZOJ 3143 游走 | 数学期望 高斯消元
啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下 ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3576 Solved: 1608[Submit][Status ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...
- loj2542 「PKUWC2018」随机游走 【树形dp + 状压dp + 数学】
题目链接 loj2542 题解 设\(f[i][S]\)表示从\(i\)节点出发,走完\(S\)集合中的点的期望步数 记\(de[i]\)为\(i\)的度数,\(E\)为边集,我们很容易写出状态转移方 ...
- loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP
题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...
随机推荐
- COM笔记-Widows 注册表
Widows 注册表 HKEY_CLASSES_ROOT在此关键字之下,可以看到有一个CLSID关键字.在CLSID关键字之下列有系统中安装的所有组件的CLSID.注册表CLSID是一个具有如下格式的 ...
- JAVA中的clone方法剖析
原文出自:http://blog.csdn.net/shootyou/article/details/3945221 java中也有这么一个概念,它可以让我们很方便的"制造"出一个 ...
- const 修饰
int * const grape_jelly; 指针是只读的. const int * grape; int const * grape; 指针所指向的对象是只读的. 对象和指针有可能都是只读的: ...
- 从eclipse转idea不适记录【持续更新】
使用eclipse和idea时,快捷键对比 从一些最扎心的开始: 关于print一类的打印输出:System.out.println()补全 idea中可以sout.souf.serr:分别对应out ...
- Ubuntu防火墙:ufw
原始linux的防火墙是iptables,以为过于繁琐,各个发行版几乎都有自己的方案; ubuntu下的防火墙是ufw[ubuntu fireward的缩写],centos的防火墙是fireward ...
- promise的信任问题&控制反转
//信任问题 //第三方的某个库 function method(cb){ setTimeout(function(){ cb && cb(); //这个库的bug:函数被多调用了一次 ...
- golang sqlx
在项目中我们通常可能会使用database/sql连接MySQL数据库.本文借助使用sqlx实现批量插入数据的例子,介绍了sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法. sq ...
- SpringBoot整合定时任务----Scheduled注解实现(一个注解全解决)
一.使用场景 定时任务在开发中还是比较常见的,比如:定时发送邮件,定时发送信息,定时更新资源,定时更新数据等等... 二.准备工作 在Spring Boot程序中不需要引入其他Maven依赖 (因为s ...
- 你的 SQL 还在回表查询吗?快给它安排覆盖索引
什么是回表查询 小伙伴们可以先看这篇文章了解下什么是聚集索引和辅助索引:Are You OK?主键.聚集索引.辅助索引,简单回顾下,聚集索引的叶子节点包含完整的行数据,而非聚集索引的叶子节点存储的是每 ...
- KMP算法中的几个疑问
KMP算法next数组求解实现 首先我们通过应用场景将KMP算法中用到的名词做一个说明: 在一个字符串(string1)中查询是否存在另一个字符串(string2). 在字符串匹配算法中,我们通常将字 ...