[P6154] 游走 - 期望
Description
给定一个有向无环图,求其中一条路径长度的期望。
Solution
一条路径长度的期望 = 所有路径长度和 / 所有路径条数
计算这两个东西用 dp,设 (f[i]) 为 i 出发的路径的长度和,(c[i]) 为 i 出发的路径的条数
转移时,(f[i]) 为所有后继的路径长度和 + 所有后继的路径条数和,(g[i]) 为所有后继路径条数和 +1
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
const int mod = 998244353;
int qpow(int p, int q) { return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod; }
int inv(int p) { return qpow(p, mod - 2); }
int n, m;
vector<int> g[N];
int f[N], c[N];
void dfs(int p)
{
c[p] = 1;
for (auto q : g[p])
{
if (c[q] == 0)
dfs(q);
f[p] += f[q] + c[q];
c[p] += c[q];
}
f[p] %= mod;
c[p] %= mod;
}
signed main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int t1, t2;
cin >> t1 >> t2;
g[t1].push_back(t2);
}
for (int i = 1; i <= n; i++)
if (c[i] == 0)
dfs(i);
int sf = 0, sc = 0;
for (int i = 1; i <= n; i++)
sf += f[i], sc += c[i];
sf %= mod;
sc %= mod;
cout << sf * inv(sc) % mod << endl;
}