参考于:xls tql
d[i]表示以i为起点的期望天数,
对于节点u,首先需要在u玩一天,第二天我可以有1 / (son + 1)概率去u的某一个子节点,也有1 / (son + 1)概率待在u,d[u] = 1,d[u] = d[u] + (d[vi] + 1)* 1 / (son + 1) + 1 / (son + 1),坐车需要一天所以是d[vi] + 1,如果第二天我还在u,那么第三天我必须要走了,去u的某一个子节点,概率为1 / (son + 1) * 1 / son ,d[u] = d[u] + 1 / (son + 1) * 1 / son * (d[vi] + 1) ,
所以 d[u] = d[u] + (d[vi] + 1)* 1 / (son + 1) + 1 / (son + 1) * 1 / son * (d[vi] + 1) + 1 / (son + 1)
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+100;
typedef long long ll;
#define mod 998244353
int t;
int n,m;
vector<int> G[M];
int vis[M];
ll d[M];
ll p[M];
void init(){
for(int i = 0; i <= n; i++){
G[i].clear();
}
memset(vis, 0, sizeof(int)*(n+1));
}
ll qpow(ll a, int x){
ll res=1;
while(x){
if(x & 1) res = res * a % mod;
a = a * a % mod;
x /= 2;
}
return res;
}
void dfs(int u){
int v;
d[u]=1;
int son=G[u].size();
for(int i = 0; i < son; i++){
v = G[u][i];
if(!vis[v]){
vis[v] = 1;
dfs(v);
}
d[u] = d[u] + p[1 + son] * (d[v] + 1) % mod + p[1 + son] * p[son] % mod * (d[v] + 1) %mod;
d[u] %= mod;
}
d[u]=(d[u] + p[1 + son]) % mod;
}
int main(){
scanf("%d", &t);
p[1] = 1ll;
for(int i = 2; i <= 100000; i++){
p[i] = qpow(1ll * i, mod - 2);
}
while(t--){
scanf("%d%d", &n, &m);
init();
int u, v;
for(int i = 0; i < m; i++){
scanf("%d%d", &u, &v);
G[u].push_back(v);
}
vis[1]=1;
dfs(1);
printf("%lld\n",d[1]);
}
return 0;
}