题目
有一个随机数生成器,每次生成 i i i的概率为 p i p_i pi,如果现在生成的数不小于之前生成的所有数,继续随机,反之,记上分数为 n 2 n^2 n2, n n n为已经生成的数的个数
思路
设最长答案长度是
l
e
n
len
len,
设生成函数,设它的系数是
l
e
n
>
i
len>i
len>i的概率
P
(
l
e
n
>
i
)
P(len>i)
P(len>i),得:
f
(
x
)
=
∑
i
=
0
∞
P
(
l
e
n
>
i
)
x
i
f(x)=\sum_{i=0}^{\infin}P(len>i)x^i
f(x)=∑i=0∞P(len>i)xi
对于一种情况,设第 i i i个不同的数出现过 c n t i cnt_i cnti次,那么该种情况的概率为: ∏ i = 1 n p i c n t i \prod_{i=1}^{n}p_i^{cnt_i} ∏i=1npicnti
所以我们可以枚举每一个数可能出现的次数,它的生成函数为:
g
i
(
x
)
=
∑
j
=
0
∞
p
i
j
x
j
=
1
1
−
p
i
x
g_i(x)=\sum_{j=0}^{\infin}p_i^jx^j=\frac{1}{1-p_ix}
gi(x)=∑j=0∞pijxj=1−pix1
把所有可能的次数乘起来,每一个结果都对应不同的情况:
f
(
x
)
=
∏
i
=
1
n
g
i
(
x
)
f(x)=\prod_{i=1}^{n}g_i(x)
f(x)=∏i=1ngi(x)
带入上方公式:
f
(
x
)
=
∏
i
=
1
n
1
1
−
p
i
x
f(x)=\prod_{i=1}^{n}\frac{1}{1-p_ix}
f(x)=∏i=1n1−pix1
长度等于
i
i
i时的概率
P
(
l
e
n
=
i
)
=
P
(
l
e
n
>
i
−
1
)
−
P
(
l
e
n
>
i
)
P(len=i)=P(len>i-1)-P(len>i)
P(len=i)=P(len>i−1)−P(len>i)
答案
E
(
l
e
n
=
i
)
=
P
(
l
e
n
=
i
)
∗
i
2
E(len=i)=P(len=i)*i^2
E(len=i)=P(len=i)∗i2
所有答案为:
∑
i
=
1
∞
(
P
(
l
e
n
>
i
−
1
)
−
P
(
l
e
n
>
i
)
)
∗
i
2
\sum_{i=1}^{\infin}(P(len>i-1)-P(len>i))*i^2
∑i=1∞(P(len>i−1)−P(len>i))∗i2
=
.
.
.
+
P
(
l
e
n
>
i
−
1
)
i
2
−
P
(
l
e
n
>
i
)
i
2
+
P
(
l
e
n
>
i
)
∗
(
i
+
1
)
2
−
P
(
l
e
n
>
i
+
1
)
(
i
+
1
)
2
+
.
.
.
=...+P(len>i-1)i^2-P(len>i)i^2+P(len>i)*(i+1)^2-P(len>i+1)(i+1)^2+...
=...+P(len>i−1)i2−P(len>i)i2+P(len>i)∗(i+1)2−P(len>i+1)(i+1)2+...
=
∑
i
=
0
∞
(
P
(
l
e
n
>
i
)
)
∗
(
(
i
+
1
)
2
−
i
2
)
=\sum_{i=0}^{\infin}(P(len>i))*((i+1)^2-i^2)
=∑i=0∞(P(len>i))∗((i+1)2−i2)
(
看
到
有
地
方
再
说
P
(
l
e
n
>
0
)
的
时
候
的
问
题
,
i
=
0
的
时
候
也
满
足
这
个
式
子
)
(看到有地方再说P(len>0)的时候的问题,i=0的时候也满足这个式子)
(看到有地方再说P(len>0)的时候的问题,i=0的时候也满足这个式子)
=
∑
i
=
0
∞
(
P
(
l
e
n
>
i
)
)
∗
(
2
i
+
1
)
=\sum_{i=0}^{\infin}(P(len>i))*(2i+1)
=∑i=0∞(P(len>i))∗(2i+1)
f
(
x
)
=
∑
i
=
1
∞
P
(
l
e
n
>
i
)
x
i
f(x)=\sum_{i=1}^{\infin}P(len>i)x^i
f(x)=∑i=1∞P(len>i)xi
f
′
(
x
)
=
i
∗
∑
i
=
1
∞
P
(
l
e
n
>
i
)
x
i
−
1
f'(x)=i*\sum_{i=1}^{\infin}P(len>i)x^{i-1}
f′(x)=i∗∑i=1∞P(len>i)xi−1
f
(
1
)
=
∑
i
=
1
∞
P
(
l
e
n
>
i
)
f(1)=\sum_{i=1}^{\infin}P(len>i)
f(1)=∑i=1∞P(len>i)
f
′
(
1
)
=
i
∗
∑
i
=
1
∞
P
(
l
e
n
>
i
)
f'(1)=i*\sum_{i=1}^{\infin}P(len>i)
f′(1)=i∗∑i=1∞P(len>i)
∑
i
=
1
∞
(
P
(
l
e
n
>
i
−
1
)
−
P
(
l
e
n
>
i
)
)
∗
i
2
\sum_{i=1}^{\infin}(P(len>i-1)-P(len>i))*i^2
∑i=1∞(P(len>i−1)−P(len>i))∗i2
=
.
.
.
+
P
(
l
e
n
>
i
−
1
)
i
2
−
P
(
l
e
n
>
i
)
i
2
+
P
(
l
e
n
>
i
)
∗
(
i
+
1
)
2
−
P
(
l
e
n
>
i
+
1
)
(
i
+
1
)
2
+
.
.
.
=...+P(len>i-1)i^2-P(len>i)i^2+P(len>i)*(i+1)^2-P(len>i+1)(i+1)^2+...
=...+P(len>i−1)i2−P(len>i)i2+P(len>i)∗(i+1)2−P(len>i+1)(i+1)2+...
代入原式子: ∑ i = 1 ∞ ( P ( l e n > i ) ) ∗ ( 2 i + 1 ) = 2 ∗ f ′ ( 1 ) + f ( 1 ) \sum_{i=1}^{\infin}(P(len>i))*(2i+1)=2*f'(1)+f(1) ∑i=1∞(P(len>i))∗(2i+1)=2∗f′(1)+f(1)
f
(
1
)
=
∏
i
=
1
n
1
1
−
p
i
f(1)=\prod_{i=1}^{n}\frac{1}{1-p_i}
f(1)=∏i=1n1−pi1
f
′
(
x
)
=
f
(
x
)
∑
i
=
1
n
p
i
1
−
p
i
x
f'(x)=f(x)\sum_{i=1}^{n}\frac{p_i}{1-p_ix}
f′(x)=f(x)∑i=1n1−pixpi
f
′
(
1
)
=
f
(
1
)
∑
i
=
1
n
p
i
1
−
p
i
f'(1)=f(1)\sum_{i=1}^{n}\frac{p_i}{1-p_i}
f′(1)=f(1)∑i=1n1−pipi
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
int w[1000],p[1000];
const int mod =998244353;
int quick_pow(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
cin>>w[i];
ans+=w[i];
}
int inv=quick_pow(ans,mod-2)%mod;
int pp=0,f1=1;
for(int i=1;i<=n;i++){
p[i]=w[i]*inv%mod;
f1=(f1*quick_pow((1-p[i]+mod),mod-2))%mod;
pp=(pp+p[i]*quick_pow(1-p[i]+mod,mod-2)%mod)%mod;
}
cout<<(f1+2*f1*pp%mod)%mod<<endl;
return 0;
}