P4321 随机漫游 题解

news/2025/3/3 20:38:32/文章来源:https://www.cnblogs.com/laoshan-plus/p/18749248

P4321 随机漫游

\(n\le18\) 的数据范围显然不是白给的,考虑设计状态中包含一个二进制数 \(S\) 表示走过了哪些关键点。状态设计就是 \(f_{S,u}\),表示已经走过了点集为 \(S\) 的点,现在在 \(u\),走到 \(n\) 的期望步数。

期望 DP 逆推,于是有:

\[f_{S,u}=\frac1{\deg(u)}\Bigg(\sum_{(v,u)\in E}f_{S\cup v,v}\Bigg)+1 \]

这显然是有后效性的,考虑高斯消元。但是 \(2^nn\) 个状态让高斯消元直接似了。发现我们的转移总是由 \(S\) 较大的点转移到 \(S\) 较小的点,这让我们想到从大到小枚举 \(S\),由于比当前的 \(S\) 大的 \(S\) 我们都已经算过了,所以对于每一个 \(S\) 都构造出单独的一个线性方程组,而这个方程组的次数是 \(n\)\(O(n^3)\) 的高斯消元可以承受。然后算出来的值再保存下来即可。

这样复杂度就优化到了 \(O(2^nn^3)\)

至于询问,由于我们已经算出了每一个状态的答案,那么对于询问集合 \(T\) 和起点 \(x\),我们只需输出 \(f_{(\complement T)\cup x,x}\) 即可,其中 \(\complement T\) 是 \(T\) 关于全集的补集。这样回答询问就是 \(O(1)\) 的。

#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
#define inv(x) power(x,MOD-2)
using namespace std;char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){int x=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}
template<typename T>
void write(T x,char sf='\n'){if(x<0)putchar('-'),x=~x+1;int top=0;do str[top++]=x%10,x/=10;while(x);while(top)putchar(str[--top]+48);if(sf^'#')putchar(sf);
}
using ll=long long;
constexpr int MAXN=20,MAXM=405;
constexpr ll MOD=998244353;
int n,m,q,deg[MAXN];
vector<int>g[MAXN];
ll a[MAXN][MAXN],f[1<<18][MAXN];ll power(ll a,ll b){ll res=1;for(;b;a=a*a%MOD,b>>=1)if(b&1)res=res*a%MOD;return res;
}
void add(ll&x,ll y){x=(x+y>=MOD?x+y-MOD:x+y);
}
void sub(ll&x,ll y){x=(x-y<0?x-y+MOD:x-y);
}
void gauss_jordan(){for(int i=1;i<=n;i++){for(int k=i;k<=n;k++)if(a[k][i]){swap(a[i],a[k]);break;}for(int k=1;k<=n;k++){if(!a[k][i]||k==i) continue;ll t=a[k][i]*inv(a[i][i])%MOD;for(int j=i;j<=n+1;j++)sub(a[k][j],t*a[i][j]%MOD);}}for(int i=1;i<=n;i++) a[i][n+1]=a[i][n+1]*inv(a[i][i])%MOD;
}int main(){n=read(),m=read();for(int i=1,u,v;i<=m;i++){u=read(),v=read();g[u].emplace_back(v);g[v].emplace_back(u);deg[u]++,deg[v]++;}int B=(1<<n)-1;for(int s=B-1;s;s--){memset(a,0,sizeof(a));for(int i=1;i<=n;i++){if(!(s&1<<(i-1))) continue;a[i][i]=1,a[i][n+1]=1;ll fk=inv(deg[i]);for(auto v:g[i])if(s&1<<(v-1)) a[i][v]=MOD-fk;else add(a[i][n+1],fk*f[s|1<<(v-1)][v]%MOD);}gauss_jordan();for(int i=1;i<=n;i++)if(s&1<<(i-1))f[s][i]=a[i][n+1]; }q=read();while(q--){int k=read(),s=0;for(int i=1;i<=k;i++) s|=1<<(read()-1);int x=read();write(f[(B^s)|1<<(x-1)][x]);}return fw,0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893126.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修理牛棚

思路: 有的牛棚住牛,有的是空的,从反过来的思路来想,先用一块木板盖住所有有猪住的猪棚,减去空牛棚数,最终得到最多被木板挡住门的牛棚的数量。 代码展示: #include<bits/stdc++.h> using namespace std; const int N=210; int m,s,c;int a[N],b[N];int main() {c…

写了个 CasaOS/ZimaOS 内网穿透的远程访问插件(不是 frp 或者 nps),欢迎大家测试使用

插件正在提交,应该过几天就会进入市场了。 插件访问效果大概如下: casaOS 远程界面 如果大家想先行测试可以手动下载 pr 的文件进行测试。使用 插件会提供一个二维码,使用OpenIoThub 开源 APP扫码添加插件网关,然后在客户端上添加要访问的主机,然后在主机下面添加端口,然…

20241904 2024-2025-2 《网络攻防实践》第一周作业

​ 一、知识点梳理与总结 1、 实验介绍 1) VM操作系统的三种网络连接方式的适用情况 (1)桥接(Bridged)模式 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一…

从cURL到GraphQL:不同API类型概述

从cURL到GraphQL:不同API类型概述 API(应用程序编程接口)是现代软件开发的支柱,能够使不同的应用程序进行通信、共享数据并无缝执行任务。了解各种API类型及其实际应用可以为开发人员提供宝贵的见解。本文将探讨不同的API类型、它们的重要性,并通过实际示例说明它们的应用…

【H2O】--【HybrIK】关于RGB2SMPL算法工程HybrIK的安装记录

1. 前言 主要记录关于RGB2SMPL算法工程HybrIK的安装记录。 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.0 torch_tricks model.train()的作用是启用 Batch Normalization 和 Dropout。 m…

粤港澳大湾区-工业软件中心-诚聘CAE测试专家、高性能计算专家、系统工程师、CAE软件架构师、嵌入式软件开发工程师、数据库软件测试工程师等(广州 不限制年龄)

简介 粤港澳大湾区国家技术创新中心工业软件产业发展中心,是粤港澳大湾区国家技术创新中心直属创新平台之一。该中心致力于聚焦工业软件基础创新,构建工业软件全过程创新生态链,为推动我国工业软件产业发展做出重要贡献。 主要目标攻克核心技术: 突破工业软件核心关键技术,…

09 深度神经网络框架的基础:自动微分

当神经网络的层数增加,结构变复杂后,如果只用纯python(再加Numpy)来实现,代码将变得异常复杂,且难以阅读和调试。此时,就需要引入一些著名的深度学习框架了,比如PyTorch, TensorFlow等。 运用这些框架,你往往只需要定义一个神经网络的架构,反向传播过程则是自动完成的…

WebSocket调试工具深度对比:Postman与Apipost功能实测解析

WebSocket调试工具深度对比:Postman与Apipost功能实测解析 作为长期从事实时通讯系统开发的工程师,WebSocket协议在开发中是非常常见的。作为一种常见的 Web 协议,其与 Restful API 有着本质的不同。Restful API是基于请求-响应模式的单向通信,而 WebSocket 提供全双工通信…

leetcode hot 18

解题思路:这题思路就是用某个数据结构记录需要被置0的行和列,一般需要两次遍历。我采用集合的形式,最省空间的方法就是用数组的第一行和第一列来记录,但是要遍历一遍是是否第一行或第一列有0。 class Solution {public void setZeroes(int[][] matrix) {Set<Integer> …

中国版Workday从上千家大型跨国企业的实践总结:员工体验很重要

20世纪90年代中期,从Oracle、SAP等国外ERP巨头进入中国,并拿下华为、联想等一流企业,至今也依然保持着中国市场的优势地位。即便到了“国外企业应用软件在中国逐步式微”的今天,SAP约10000亿元的市值,也远超用友的约1000亿元市值。其中很大一个原因在于,中国企业的聪明—…

易路iBuilder—国内首个HR智能体管理平台,高效管理企业数字劳动力

易路iBuilder智能体平台不仅是工具集合,更是企业数字化转型的 “智能中枢”。它通过知识驱动、流程重构、人机共融,帮助企业将AI Agent从“执行者”升级为“战略伙伴”,最终实现 “人类定义价值,机器放大价值”的新工作范式。随着大模型技术的商业应用日益成熟,AI数字员工…