P6154 游走
题解
由于选择每一条路径的概率是一样的,所以我们统计出所有路径的条数,和长度之和,然后除一下就行了,除法求模等价于乘模数下的逆元
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
ll lanes[100005]={0},sum[100005]={0},in[100005]={0};//lanes[now]代表以now为结尾的路径总数
vector<int> G[100005];
int n,m;
int qpow(ll a,ll x)
{
ll res=1;
while(x)
{
if(x&1) res=res*a%mod;
a*=a;
a%=mod;
x>>=1;
}
return res;
}
ll ny(ll q)
{
return qpow(q,mod-2)%mod;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
in[y]++;
}
queue<int> q;
for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
while(q.size())
{
int now=q.front();
q.pop();
lanes[now]++;
lanes[now]%=mod;
for(auto next:G[now])
{
lanes[next]+=lanes[now];
lanes[next]%=mod;
sum[next]+=sum[now]+lanes[now]*1LL;
sum[next]%=mod;
in[next]--;
if(!in[next]) q.push(next);
}
}
ll ans=0,cnt=0;
for(int i=1;i<=n;i++)
{
ans+=sum[i];
ans%=mod;
cnt+=lanes[i];
cnt%=mod;
}
cout<<ans*ny(cnt)%mod;
return 0;
}

浙公网安备 33010602011771号