P4321-随机漫游【状压dp,数学期望,高斯消元】
生活随笔
收集整理的這篇文章主要介紹了
P4321-随机漫游【状压dp,数学期望,高斯消元】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P4321
題目大意
給出nnn個點mmm條邊的一張無向圖,qqq次詢問。
每次詢問給出一個點集和一個起點,求從起點出發隨機游走經過所有點集的期望步數。
n∈[1,18],m∈[1,n(n?1)2],q∈[1,105]n\in[1,18],m\in[1,\frac{n(n-1)}{2}],q\in[1,10^5]n∈[1,18],m∈[1,2n(n?1)?],q∈[1,105]
解題思路
首先nnn很小可以狀壓經過點的狀態,然后因為這個詢問是給出起始狀態所以需要倒推。設fs,xf_{s,x}fs,x?表示目前狀態是sss,在點xxx,覆蓋所有點的期望次數。
那么有方程
fS,x=∑x?>yfS∩y,yf_{S,x}=\sum_{x->y}f_{S\cap y,y}fS,x?=x?>y∑?fS∩y,y?
然后SSS不同的當常數,相同的高斯消元轉移即可。
時間復雜度O(2nn3)O(2^nn^3)O(2nn3)
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,数学期望,高斯消元】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么用电脑玩贪吃蛇大作战(电脑版)
- 下一篇: YbtOJ#631-次短路径【左偏树,最