正题

题目链接: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\),覆盖所有点的期望次数。

那么有方程

\[f_{S,x}=\sum_{x->y}f_{S\cap y,y}
\]

然后\(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,数学期望,高斯消元】的更多相关文章

  1. BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3074  Solved: 1599 [Submit][Sta ...

  2. UVa 10828 Back to Kernighan-Ritchie (数学期望 + 高斯消元)

    题意:给定一个 n 个结点的有向图,然后从 1 结点出发,从每个结点向每个后继结点的概率是相同的,当走到一个没有后继结点后,那么程序终止,然后问你经过每个结点的期望是次数是多少. 析:假设 i 结点的 ...

  3. 【BZOJ】1076: [SCOI2008]奖励关(状压dp+数学期望)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1076 有时候人蠢还真是蠢.一开始我看不懂期望啊..白书上其实讲得很详细的,什么全概率,全期望(这个压 ...

  4. BZOJ 3143 游走 | 数学期望 高斯消元

    啊 我永远喜欢期望题 BZOJ 3143 游走 题意 有一个n个点m条边的无向联通图,每条边按1~m编号,从1号点出发,每次随机选择与当前点相连的一条边,走到这条边的另一个端点,一旦走到n号节点就停下 ...

  5. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

  6. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3576  Solved: 1608[Submit][Status ...

  7. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

  8. loj2542 「PKUWC2018」随机游走 【树形dp + 状压dp + 数学】

    题目链接 loj2542 题解 设\(f[i][S]\)表示从\(i\)节点出发,走完\(S\)集合中的点的期望步数 记\(de[i]\)为\(i\)的度数,\(E\)为边集,我们很容易写出状态转移方 ...

  9. loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP

    题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...

随机推荐

  1. 带你读AI论文丨LaneNet基于实体分割的端到端车道线检测

    摘要:LaneNet是一种端到端的车道线检测方法,包含 LanNet + H-Net 两个网络模型. 本文分享自华为云社区<[论文解读]LaneNet基于实体分割的端到端车道线检测>,作者 ...

  2. Wpf程序显示在任务栏

    后台代码如下: using System; using System.Collections.Generic; using System.Drawing; using System.IO; using ...

  3. 【版本管理工具】git的介绍及常用命令总结

    1 git简介 1.1  git是什么? "Git 是一个分布式版本控制软件,与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可 ...

  4. 【C语言】第4章 选择结构程序设计

    第4章 选择结构程序设计 C语言有两种选择语句: if 语句,实现两个分支的选择结构 switch 语句,实现多分支的选择结构 输入3个数a,b,c,要求按由小到大的顺序输出. 可以先用伪代码写出算法 ...

  5. 备忘录——C#获取微信小程序的云数据库中数据

    目录 0. 背景说明 0.2 获取AccessToken 0.3 数据库查询 0.4 文件下载 2. 简单的封装 3. 简单测试 4. 参考文档 shanzm-2021年8月17日 17:14:24 ...

  6. Redis(二):基本数据类型

    基础 # redis默认有16个数据库,数组下标从0开始,默认使用0号库 # 当我们启动服务器并连接客户端之后: set <key> <value> # 向数据库中添加数据用于 ...

  7. jQuery mobile网格布局

    3.4 内容格式化 jQuery Mobile中提供了许多非常有用的工具与组件,如多列的网格布局.折叠形的面板控制等,这些组件可以帮助开发者快速实现正文区域内容的格式化. 3.4.1 网格布局 jQu ...

  8. docker开启remote-api 2375端口后,Failed to start Docker Application Container Engine,重启docker失败的问题解决

    1.  按照网上的教程修改了 /usr/lib/systemd/system/docerk.service配置后,重启失败.修改/etc/docker/daemon.json 增加hosts后重启也是 ...

  9. openresty lua_ssl_trusted_certificate 问题

    lua_ssl_trusted_certificate 语法: lua_ssl_trusted_certificate 默认: no 环境: http, server, location 指定一个 P ...

  10. MPI集群搭建

    高性能计算     ubantu下集群搭建 参考博客:https://blog.csdn.net/u012304016/article/details/52423738(尊重别人的知识产权),一些细节 ...