CF1392H ZS Shuffles Cards 题解

题目传送门

前置知识

概率 DP

解法

\(f_{i}\) 表示有 \(i\) 张数字牌没进入 \(S\),即 \(S\) 中只有 \(n-i\) 张数字牌时的期望轮数,有 \(f_{i}= \frac{i}{i+m}f_{i-1}+ \frac{m}{i+m}(f_{i}+1)\),解得 \(f_{i}=f_{i-1}+\frac{m}{i}\),边界为 \(f_{0}=1\)

由于每一张数字牌在 joker 牌前被抽中的概率为 \(\frac{1}{m+1}\),故每一轮的期望牌数为 \(1+ \sum\limits_{i=1}^{n} \frac{1}{m+1}= 1+\frac{n}{m+1}\)

最终,有 \(f_{n}(1+\frac{n}{m+1})\) 即为所求。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'     	
const ll p=998244353;
ll f[2000010];
ll qpow(ll a,ll b,ll p)
{
    ll ans=1;
    while(b>0)
    {
        if(b&1)
        {
            ans=ans*a%p;
        }
        b>>=1;
        a=a*a%p;
    }
    return ans;
}
int main()
{   
    ll n,m,i;
    cin>>n>>m;
    f[0]=1;
    for(i=1;i<=n;i++)
    {
        f[i]=(f[i-1]+qpow(i,p-2,p)*m%p)%p;
    }
    cout<<f[n]*((qpow(m+1,p-2,p)*n%p+1)%p)%p<<endl;
    return 0;
}
posted @ 2024-03-28 18:02  hzoi_Shadow  阅读(9)  评论(0编辑  收藏  举报
扩大
缩小