Solution -「CF 1392H」ZS Shuffles Cards
\(\mathcal{Description}\)
Link.
打乱的 \(n\) 张编号 \(1\sim n\) 的数字排和 \(m\) 张鬼牌。随机抽牌,若抽到数字,将数字加入集合 \(S\);否则,还原牌堆(但不清空 \(S\))。若 \(S=[1,n]\) 且抽到鬼牌时结束抽牌。求期望抽牌次数。
\(n,m\le2\times10^6\)。
\(\mathcal{Solution}\)
称从初始牌堆开始抽牌一直到抽到鬼牌为一轮操作,发现结束时必然抽了若干个完整的轮且不能中途终止。所以“抽完一轮”和“结束抽牌”两事件独立,分别记二者的随机变量为 \(\xi_1\) 和 \(\xi_2\),则答案为 \(E(\xi_1\xi_2)=E(\xi_1)E(\xi_2)\)。
\(E(\xi_1)\) 显然等于一轮抽到数字牌的期望张数 \(+1\)。 而由期望线性性,它也等于 \(n\times p+1\),其中 \(p\) 表示抽到某一张牌的概率,有:
一种直观的解释方法是,把每张数字牌和 \(m\) 张鬼牌绑为一组,每次拿出这样一组牌,再从中随机选出一张作为抽到的牌,其它牌丢掉,不难证明这和原操作等价。显然拿出某一张数字牌所在的组时,有 \(p=\frac{1}{m+1}\) 的概率真正拿到这张数字牌,不然就永远拿不到了。于是,我们求到了:
求 \(E(\xi_2)\),令 \(f(i)\) 表示已有 \(|S|=n-i\),到结束时的期望轮数。方程有:
特别留意上式,总牌数 \(m+i\) 是因为其他 \(n-i\) 张数字牌没有任何意义,可以忽略;前一项抽到鬼牌,轮数才要 \(+1\);后一项抽到有用数字牌,但是这一轮并没有结束,所以不用 \(+1\)。
整理一下:
对于边界 \(f(1)\),即 \(m+1\) 张里挑出一张的期望,显然有 \(f(1)=m+1\)。代一代求出 \(f(n)\):
综上,答案为:
计算即可。复杂度 \(\mathcal O(n+\log m)\)。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
const int MOD = 998244353, MAXN = 2e6;
int n, m, inv[MAXN + 5];
inline int qkpow ( int a, int b, const int p = MOD ) {
int ret = 1;
for ( ; b; a = 1ll * a * a % p, b >>= 1 ) ret = 1ll * ret * ( b & 1 ? a : 1 ) % p;
return ret;
}
int main () {
scanf ( "%d %d", &n, &m );
int turn = ( n + m + 1ll ) * qkpow ( m + 1, MOD - 2 ) % MOD, times = 1;
for ( int i = 1; i <= n; ++ i ) {
inv[i] = i ^ 1 ? 1ll * inv[MOD % i] * ( MOD - MOD / i ) % MOD : 1;
times = ( times + 1ll * m * inv[i] ) % MOD;
}
printf ( "%d\n", int ( 1ll * turn * times % MOD ) );
return 0;
}