题解: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)\) 的表达式:
问题的关键落在了化简这个柿子上(累死人惹)。
先把平方展开得 \(\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}\)。
然后有:
由初中学过的求和公式(证明网上到处都是,这里不再赘述):
- 自然数求和:\(\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}\)。
代入柿子可以得到:
分子提一个 \((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\)。
接下来:
综上有:
引理 \(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\),我们得到了最终柿子:
用逆元处理即可。
而当 \(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;
}