2021牛客暑期多校训练营#9:I-Incentive Model
原题链接:https://ac.nowcoder.com/acm/contest/11260/I
题目大意
有A、B两人一起逐个挖 n ( 1 ≤ n < 998244353 ) n(1\leq n< 998244353) n(1≤n<998244353)块矿,对于同一块矿,有 a a a的概率属于A,有 b b b的概率属于B,其中 a , b a,b a,b为双方当时的股权占比, a + b = 1 a+b=1 a+b=1。某方拥有一块矿后,其股权增加 w w w。初始A拥有 x y \frac{x}{y} yx的股权,B拥有 1 − x y 1-\frac{x}{y} 1−yx的股权。求A能获得矿的期望。
解题思路
一个接近
1
0
10
10^{10}
1010很明显不能用枚举法做,只能用通项式或快速幂或矩阵快速幂做,首先写出递推式:
设S_i为第i块矿挖出后A的股权,则递推式为
S
i
=
S
i
−
1
+
S
i
−
1
1
+
W
(
i
−
1
)
W
=
S
i
−
1
1
+
W
i
1
+
W
(
i
−
1
)
=
1
+
W
i
1
+
W
(
i
−
1
)
×
1
+
W
(
i
−
1
)
1
+
W
(
i
−
2
)
×
1
+
W
i
−
2
1
+
W
(
i
−
3
)
…
×
S
0
(
S
0
=
a
)
=
(
1
+
W
i
)
a
\begin{aligned} S_i&=S_{i-1}+\frac{S_{i-1}}{1+W(i-1)}W\\ &=S_{i-1}\frac{1+Wi}{1+W(i-1)}\\ &=\frac{1+Wi}{1+W(i-1)}\times\frac{1+W(i-1)}{1+W(i-2)}\times\frac{1+W{i-2}}{1+W(i-3)}\ldots \times S_0(S_0=a)\\ &=(1+Wi)a \end{aligned}
Si=Si−1+1+W(i−1)Si−1W=Si−11+W(i−1)1+Wi=1+W(i−1)1+Wi×1+W(i−2)1+W(i−1)×1+W(i−3)1+Wi−2…×S0(S0=a)=(1+Wi)a
答案就是
S
i
−
a
W
=
a
i
a
n
s
=
n
a
=
n
x
y
\begin{aligned} \frac{S_i-a}{W}&=ai\\ ans&=na= n\frac{x}{y}\end{aligned}
WSi−aans=ai=na=nyx
求出y的逆元相乘取模即可
代码实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=998244353;
ll n,x,w,y;
ll powmod(ll x,ll p)
{
ll res=1;
while(p)
{
p&1?res=res*x%mod:0;
x=x*x%mod;
p>>=1;
}
return res;
}
int main()
{
cin>>n>>w>>x>>y;
cout<<n*x%mod*powmod(y,mod-2)%mod;
return 0;
}