洛谷傳送門
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。由於火星上非常乾燥,經常引發火...