日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?fSy,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,数学期望,高斯消元】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。