洛谷 P6154 遊走

2022-03-20 03:01:38 字數 1782 閱讀 7012

洛谷傳送門

zbw 在 b 城遊走。

b 城可以看作乙個有 nn 個點 mm 條邊的有向無環圖可能存在重邊

zbw 在 b 城隨機遊走,他會隨機選擇一條路徑,選擇所有路徑的概率相等。路徑的起點和終點可以相同。

定義一條路徑的長度為經過的邊數,你需要求出 zbw 走的路徑長度的期望,答案對 998244353998244353 取模。

第一行兩個整數 n,mn,m。

接下來 mm 行,每行兩個整數 x,yx,y,表示存在一條從 xx 到 yy 的有向邊。

一行乙個整數,表示答案對 998244353998244353 取模後的值。

暴力思路:

從每個點開始全圖遍歷,累加出所有路徑條數和路徑長度和,兩者相除求逆元即是答案。

開longlong。

目標40pts,實測 pts。

**:

#include#define int long long

using namespace std;

const int maxn=1e5+10;

const int maxm=7*1e5+10;

const int tt=5*1e6;

const int mod=998244353;

int n,m,cnt,tmp;

int tot,to[maxm],nxt[maxm],head[maxn];

int inv[tt];

void add(int x,int y)

void dfs(int x,int dep)

}signed main()

for(int i=1;i<=n;i++)

dfs(i,0);

int ans=(tmp*inv[cnt])%mod;

printf("%lld\n",ans);

return 0;

}

正解記憶化?本來以為是什麼期望dp+拓排之類的小神題(當然對於學弟來講是水題)。結果正解就是暴搜+記憶化優化。

懷疑人生。

逆元沒有必要拿線性求逆元,因為998244353是質數,所以逆元直接就是\(a^\),快速冪即可。

**:

#include#define int long long

using namespace std;

const int maxn=1e5+10;

const int maxm=7*1e5+10;

const int tt=5*1e6;

const int mod=998244353;

int n,m,cnt,tmp,ans;

int tot,to[maxm],nxt[maxm],head[maxn];

int f[maxn],g[maxn];

//f[i]表示以i為起點的路徑條數,g[i]表示以i為起點的路徑總長

void add(int x,int y)

void dfs(int x)

}int qpow(int a,int b)

return ret%mod;

}signed main()

for(int i=1;i<=n;i++)

if(!f[i])

dfs(i);

for(int i=1;i<=n;i++)

ans=(tmp%mod*qpow(cnt,mod-2)%mod)%mod;

printf("%lld\n",ans);

return 0;

}

P6154 遊走 使用期望定義求解

遊走 記錄一下,用到了期望定義的求法,我居然試圖用dpdp dp求解 設sum nsumn sumn 為總路徑長度,num numnu m為路徑總數量 那麼期望是sum nnum frac numsum n 知道了這個,拓撲排序可以很容易求得 include using namespace std ...

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...

洛谷練習P2279 P1346

2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...