Hounter
这题是概率与期望,不是很熟,所以冲了两篇题解才来写总结。
首先可以发现1猎人死的轮数是他之前死了的列人数加一。
那么题目转化为求先于一号猎人死的猎人数的期望值。
考虑这样一个事情,就是所有的情况都可以按照一对猎人来划分,就是划分为猎人\(a\)先死于猎人\(b\)与猎人\(b\)先死于猎人\(a\)。
所以\(i\)号猎人先死于1号猎人的概率是\(\frac{W_{i}}{W_{i}+W_{1}}\),贡献是一,所以直接求和即可。
最后还要加一,因为是猎人数加一等于轮数。
Code
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
#define rr register
typedef long long ll;
const int N=1e5+4;
const int mod=998244353;
int n;
int w[N];
int read()
{
rr int x_read=0,y_read=1;
rr char c_read=getchar();
while(c_read<'0'||c_read>'9')
{
if(c_read=='-') y_read=-1;
c_read=getchar();
}
while(c_read<='9'&&c_read>='0')
{
x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
c_read=getchar();
}
return x_read*y_read;
}
ll qpow(ll base,ll exp)
{
ll ret=1ll;
while(exp)
{
if(exp&1) ret=ret*base%mod;
base=base*base%mod;
exp>>=1;
}
return ret;
}
};
using namespace STD;
int main()
{
n=read();
for(rr int i=1;i<=n;i++) w[i]=read();
ll ans=0;
for(rr int i=2;i<=n;i++)
ans=(ans+qpow(1ll*w[1]+w[i],mod-2)*w[i]%mod)%mod;
cout<<ans+1<<'\n';
}
题解冲的是ZZ_zuozhe与401rk8的万分感谢。
2021-08-08 21:26:17 星期日