概率论好题:洛谷P5389 [Cnoi2019]数学课

该博客详细介绍了洛谷P5389数学课的题目,讨论了如何求解使得a<b的概率问题。通过分析,博主推导出概率为2*(1 - n*(n+2)/3),并给出了当n趋向无穷大时的答案。还分享了平方和和立方和的公式,辅助理解解题过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

给定一个序列 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} 21p

我们考虑每个数生成的概率。可以发现,第 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(i1)+1 i ( i + 1 ) 2 \frac{i(i+1)}{2} 2i(i+1) ( n − i + 1 ) (n-i+1) (ni+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(ni+1)
i ( i − 1 ) 2 + 1 \frac{i(i-1)}{2}+1 2i(i1)+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)} in(n+1)(n+2)6(ni+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)} in(n+1)(n+2)6(ni+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} in(n+1)(n+2)6(ni+1)=n2(n+1)2(n+2)236i(ni+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(ni+1)2=i(n2+2n+1+i22ni2i2)=(n+1)2i+i32(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)23612n(n+1)2(n+2)=n(n+2)3

求得一个优美的答案,很舒服。

那我们的最终答案即为
1 − 3 n ( n + 2 ) 2 \frac{1-\frac{3}{n(n+2)}}{2} 21n(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;
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值