题目大意
给定一个序列 a a a ,满足 a n = 1 + 2 + 3 + . . . + n a_{n}=1+2+3+...+n an=1+2+3+...+n,根据题目给定的概率选择其中两个(可相同)的元素 v 1 , v 2 v1,v2 v1,v2 ,我们记录 a ∈ [ 1... v 1 ] a \in [1...v1] a∈[1...v1], b ∈ [ 1... v 2 ] b \in [1...v2] b∈[1...v2] , a a a 和 b b b 都等概率地选择区间内的数,求使得 a < b a<b a<b 的概率(模 998244353 998244353 998244353)。
其中,假设选择第 i i i 个元素,那么选中第 i i i 个元素的概率为:
3 i ∗ ( i + 1 ) n ( n + 1 ) ( n + 2 ) \frac{3i * (i+1)}{n(n+1)(n+2)} n(n+1)(n+2)3i∗(i+1)
样例输入:
2
样例输出:
686292993
题解
做一下简单的分析,我们 a a a 和 b b b 的生成方法相同,所以我们 a < b a<b a<b 和 a > b a>b a>b 的概率是相等的,所以假设 a = b a=b a=b 的概率为 p p p 那么答案就为 1 − p 2 \frac{1-p}{2} 21−p 。
我们考虑每个数生成的概率。可以发现,第
i
i
i 个元素中含有
i
(
i
+
1
)
2
\frac{i(i+1)}{2}
2i(i+1) 个数,那么在第
i
i
i 个元素内选中某一个数的概率为:
3
i
∗
(
i
+
1
)
n
(
n
+
1
)
(
n
+
2
)
∗
2
i
(
i
+
1
)
=
6
n
(
n
+
1
)
(
n
+
2
)
\frac{3i*(i+1)}{n(n+1)(n+2)}*\frac{2}{i(i+1)}=\frac{6}{n(n+1)(n+2)}
n(n+1)(n+2)3i∗(i+1)∗i(i+1)2=n(n+1)(n+2)6
可以发现
i
i
i 被消掉了,这证明我们
a
a
a 和
b
b
b 选择的概率,不和是第几个元素有关,而是和被多少个元素包含有关,所以现在我们要找到每个数被多少元素包含。
经过打表 分析,
i
(
i
−
1
)
2
+
1
\frac{i(i-1)}{2}+1
2i(i−1)+1 到
i
(
i
+
1
)
2
\frac{i(i+1)}{2}
2i(i+1) 被
(
n
−
i
+
1
)
(n-i+1)
(n−i+1) 个元素包含,所以其中任意一个数被选中的概率为:
6
(
n
−
i
+
1
)
n
(
n
+
1
)
(
n
+
2
)
\frac{6(n-i+1)}{n(n+1)(n+2)}
n(n+1)(n+2)6(n−i+1)
从
i
(
i
−
1
)
2
+
1
\frac{i(i-1)}{2}+1
2i(i−1)+1 到
i
(
i
+
1
)
2
\frac{i(i+1)}{2}
2i(i+1) 一共有
i
i
i 个数,那么这一段抽到
a
a
a 和
b
b
b 相同的概率即为
i
∗
6
(
n
−
i
+
1
)
n
(
n
+
1
)
(
n
+
2
)
i*\frac{6(n-i+1)}{n(n+1)(n+2)}
i∗n(n+1)(n+2)6(n−i+1) 。
因为一共有
n
n
n 段,所以总的概率即为(以下求和默认为
i
=
1...
n
i=1...n
i=1...n,懒得打了):
∑
i
∗
6
(
n
−
i
+
1
)
n
(
n
+
1
)
(
n
+
2
)
\sum i*\frac{6(n-i+1)}{n(n+1)(n+2)}
∑i∗n(n+1)(n+2)6(n−i+1)
但是这样是
O
(
n
)
O(n)
O(n) 的,肯定会爆,所以我们要对式子进行化简,化简如下 。
∑ i ∗ 6 ( n − i + 1 ) n ( n + 1 ) ( n + 2 ) = 36 ∑ i ( n − i + 1 ) 2 n 2 ( n + 1 ) 2 ( n + 2 ) 2 \sum i*\frac{6(n-i+1)}{n(n+1)(n+2)}\\=\frac{36\sum i(n-i+1)^2}{n^2(n+1)^2(n+2)^2} ∑i∗n(n+1)(n+2)6(n−i+1)=n2(n+1)2(n+2)236∑i(n−i+1)2
我们对求和部分进行化简:
∑ i ( n − i + 1 ) 2 = ∑ i ( n 2 + 2 n + 1 + i 2 − 2 n i − 2 i 2 ) = ( n + 1 ) 2 ∑ i + ∑ i 3 − 2 ( n + 1 ) ∑ i 2 \sum i(n-i+1)^2\\=\sum i(n^2+2n+1+i^2-2ni-2i^2)\\=(n+1)^2\sum i+\sum i^3-2(n+1) \sum i^2 ∑i(n−i+1)2=∑i(n2+2n+1+i2−2ni−2i2)=(n+1)2∑i+∑i3−2(n+1)∑i2
我们对此分别用等差数列公式,平方和公式,立方和公式去化简,求得结果为:
n ( n + 1 ) 2 ( n + 2 ) 12 \frac{n(n+1)^2(n+2)}{12} 12n(n+1)2(n+2)
带入原来的式子中:
36 ∗ n ( n + 1 ) 2 ( n + 2 ) 12 n 2 ( n + 1 ) 2 ( n + 2 ) 2 = 3 n ( n + 2 ) \frac{36*\frac{n(n+1)^2(n+2)}{12}}{n^2(n+1)^2(n+2)^2}\\ =\frac{3}{n(n+2)} n2(n+1)2(n+2)236∗12n(n+1)2(n+2)=n(n+2)3
求得一个优美的答案,很舒服。
那我们的最终答案即为
1
−
3
n
(
n
+
2
)
2
\frac{1-\frac{3}{n(n+2)}}{2}
21−n(n+2)3
当
n
n
n 为无穷大时,
3
n
(
n
+
2
)
\frac{3}{n(n+2)}
n(n+2)3 趋近于
0
0
0 ,所以答案为
1
2
\frac{1}{2}
21 。
至此,题目完美解决。
另:
平方和公式:
1
2
+
2
2
+
.
.
.
+
n
2
=
n
(
n
+
1
)
(
2
n
+
1
)
6
1^2+2^2+...+n^2=\frac{n(n+1)(2n+1)}{6}
12+22+...+n2=6n(n+1)(2n+1)
立方和公式:
1
3
+
2
3
+
.
.
.
+
n
3
=
n
2
(
n
+
1
)
2
4
1^3+2^3+...+n^3=\frac{n^2(n+1)^2}{4}
13+23+...+n3=4n2(n+1)2
代码
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,mod=998244353;
long long pw(long long x,long long y){
long long sum=1;
while(y){
if(y%2==1) sum=(sum*x)%mod;
x=(x*x)%mod;
y/=2;
}
return sum;
}
int main(){
scanf("%lld",&n);
if(n==0){
printf("%lld\n",pw(2,mod-2));
return 0;
}
else{
long long P=(3*pw(((n%mod)*((n+2)%mod))%mod,mod-2))%mod;
printf("%lld\n",(((1-P+mod)%mod)*pw(2,mod-2))%mod);
return 0;
}
}