P4321-随机漫游【状压dp,数学期望,高斯消元】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P4321


1|1题目大意

给出n个点m条边的一张无向图,q次询问。

每次询问给出一个点集和一个起点,求从起点出发随机游走经过所有点集的期望步数。

n[1,18],m[1,n(n1)2],q[1,105]


1|2解题思路

首先n很小可以状压经过点的状态,然后因为这个询问是给出起始状态所以需要倒推。设fs,x表示目前状态是s,在点x,覆盖所有点的期望次数。

那么有方程

fS,x=x>yfSy,y

然后S不同的当常数,相同的高斯消元转移即可。

时间复杂度O(2nn3)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14402759.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(54)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示