题解:P5389 [Cnoi2019] 数学课

题意

给定 \(n\le 10^{18}\),规定数列 \(\{a_n\}\) 的通项公式:\(\displaystyle a_n=\sum^{n}_{i=1}i=\dfrac{n(n+1)}{2}\),以 \(\displaystyle P(a_i)=\dfrac{a_i}{\sum^{n}_{j=1}a_j}=\dfrac{a_i}{S_n}=\dfrac{3i(i+1)}{n(n+1)(n+2)}\) 的概率从数列中选出元素 \(a_i\),并记选了两次得到的数为 \(v_1\)\(v_2\)。接下来等概率地分别从 \([1,v_1]\)\([1,v_2]\) 中选取两整数 \(a\)\(b\)。要求计算 \(P(a>b)\)

分析

题意很复杂,我们一步一步来推柿子。

直接求 \(P(a>b)\) 是困难的,不妨转化一下。接下来考虑如何转化为更好求的式子。

引理 \(1\)\(P(a>b)=P(a<b)=\dfrac{1-P(a=b)}{2}\)

证明 \(1\):题意中第一步对 \(v_1\)\(v_2\) 的选取方式是完全一样的,因此第二步中选得的 \(a\)\(b\) 本质相同,因此 \(P(a>b)\Leftrightarrow P(a<b)\),即 \(P(a>b)=P(a<b)\)。联立 \(P(a>b)+P(a<b)+P(a=b)=1\) 可解得 \(P(a>b)=P(a<b)=\dfrac{1-P(a=b)}{2}\)

因此我们只需求 \(P(a=b)\) 即可,这明显更好求一点。

下一步,考虑如何计算选中 \(v_1\) 的概率以及选中 \(a\) 的概率(\(v_2\)\(b\) 同理)。

引理 \(2\):以 \(P(v_1)\)\(P(a)\) 表示上指概率,则有 \(P(v_1)=\dfrac{6v_1}{n(n+1)(n+2)}\)\(P(a)=\dfrac{6}{n(n+1)(n+2)}\)

证明 \(2\):因为已知数列通项公式,不妨令 \(a_i=v_1\),则 \(a_i=\dfrac{i(i+1)}{2}=v_1\),变形可得:\(i^2+i-2v_1=0\)。解该一元二次方程得 \(i=\dfrac{\sqrt{1+8v_1}-1}{2}\),并带入 \(P(a_i)=\dfrac{3i(i+1)}{n(n+1)(n+2)}\) 得:

\[\begin{align} P(a_i) &= \dfrac{3\times \dfrac{\sqrt{1+8v_1}-1}{2}\times \dfrac{\sqrt{1+8v_1}+1}{2}}{n(n+1)(n+2)} \nonumber\\ &= \dfrac{\dfrac{3(1+8v_1-1)}{4}}{n(n+1)(n+2)} \nonumber\\ &= \dfrac{6v_1}{n(n+1)(n+2)} \nonumber \end{align}\]

\(P(v_1)=P(a_i)=\dfrac{6v_1}{n(n+1)(n+2)}\)\(P(a)=P(v_1)\times \dfrac{1}{v_1}=\dfrac{6}{n(n+1)(n+2)}\),证毕。

扩展结论,其实对于数列中任意一项 \(a_i\),均满足从 \([1,a_i]\) 中等概率地选取一个数的概率为 \(\dfrac{6}{n(n+1)(n+2)}\)

考虑到该数列其实是三角数数列,我们尝试把 \(\{a_n\}\) 中的每一项展开:

观察规律,不难发现,考虑 \(a_i\) 范围内元素情况,使 \(a\) 可以选到区间 \(\left[\dfrac{i(i-1)+1}{2}+1,\dfrac{i(i+1)}{2}\right]\) 内数的 \(v_1\) 一共有 \(t=n-i+1\) 个。故选到该区间内一个数的概率为 \(tP(v_1)=\dfrac{6(n-i+1)}{n(n+1)(n+2)}\)

\(b\) 也同理,整理柿子可得到 \(P(a=b)\) 的表达式:

\[\sum^{n}_{i=1}i\left[\dfrac{6(n-i+1)}{n(n+1)(n+2)}\right]^2 \]

问题的关键落在了化简这个柿子上(累死人惹)。

先把平方展开得 \(\displaystyle \sum^{n}_{i=1}\dfrac{i[36(n-i+1)^2]}{n^2(n+1)^2(n+2)^2}\),变一下形:\(\displaystyle \dfrac{36\sum^{n}_{i=1}i(n+1-i)^2}{n^2(n+1)^2(n+2)^2}\)

然后有:

\[\begin{align} P(a=b) &= \dfrac{36\sum^{n}_{i=1}[i(n+1)^2-2i^2(n+1)+i^3]}{n^2(n+1)^2(n+2)^2} \nonumber \\ &= \dfrac{36\left[(n+1)^2\sum^{n}_{i=1}-2(n+1)\sum^{n}_{i=1}i^2+\sum^{n}_{i=1}i^3\right]}{n^2(n+1)^2(n+2)^2} \nonumber \end{align} \]

由初中学过的求和公式(证明网上到处都是,这里不再赘述):

  • 自然数求和\(\displaystyle \sum^{n}_{i=1}i=\dfrac{n(n+1)}{2}\)
  • 自然数平方求和\(\displaystyle \sum^{n}_{i=1}i^2=\dfrac{n(n+1)(2n+1)}{6}\)
  • 自然数立方求和\(\displaystyle \sum^{n}_{i=1}i^3=\dfrac{n^2(n+1)^2}{4}\)

代入柿子可以得到:

\[\begin{align} P(a=b) &= \dfrac{36\left[(n+1)^2\times \dfrac{n(n+1)}{2}-2(n+1)\dfrac{n(n+1)(2n+1)}{6}+\dfrac{n^2(n+1)^2}{4}\right]}{n^2(n+1)^2(n+2)^2} \nonumber \\ &= \dfrac{18n(n+1)^3-12n(n+1)^2(2n+1)+9n^2(n+1)^2}{n^2(n+1)^2(n+2)^2} \nonumber \end{align} \]

分子提一个 \((n+1)^2\),得 \(\dfrac{(n+1)^2[18n(n+1)-12n(2n+1)+9n^2]}{n^2(n+1)^2(n+2)^2}\),惊喜地发现可以约掉一个 \((n+1)^2\)

接下来:

\[\begin{align} P(a=b) &= \dfrac{[18n(n+1)-12n(2n+1)+9n^2]}{n^2(n+2)^2} \nonumber \\ &= \dfrac{3n^2+6n}{n^2(n+2)^2} \nonumber \\ &= \dfrac{3n(n+2)}{n^2(n+2)^2} \nonumber \\ &= \dfrac{3}{n(n+2)} \nonumber \end{align} \]

综上有:

引理 \(3\)\(\displaystyle P(a=b)=\sum^{n}_{i=1}i\left[\dfrac{6(n-i+1)}{n(n+1)(n+2)}\right]^2=\dfrac{3}{n(n+2)}\)

某个可怜的人手都要敲断了

回到最初,根据引理 \(1\),我们得到了最终柿子:

\[P(a>b)=\dfrac{1-P(a=b)}{2}=\dfrac{1-\dfrac{3}{n(n+2)}}{2} \]

用逆元处理即可。

而当 \(n\to \infty\) 时,有 \(\dfrac{3}{n(n+2)}\to 0\),答案即为 \(\dfrac{1}{2}\)

代码

知道柿子后,代码实现无任何难度:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int n;
int qp(int a, int b, int p)
{
	int res = 1;
	while(b)
	{
		if(b & 1) res = res * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return res;
}
int inv(int i)
{
	return qp(i, mod - 2, mod);
}
signed main()
{
	cin >> n;
	if(n == 0) return cout << inv(2), 0;
	n %= mod;
	cout << (inv(2) * ((1 - 3 * inv(n) % mod * inv(n + 2) % mod + mod) % mod) % mod);
	return 0;
}
posted @ 2025-05-16 16:43  cold_jelly  阅读(18)  评论(0)    收藏  举报