首页 > 其他分享 >ZS Shuffles Cards 题解

ZS Shuffles Cards 题解

时间:2023-08-16 14:55:56浏览次数:55  
标签:frac int 题解 ll times Shuffles ans Cards mod

ZS Shuffles Cards 题解

我们把每一次抽一些数字牌再抽到 joker 视作一局游戏。

每局期望轮数

首先考虑 \(f_i\) 表示每一局游戏抽出 \(i\) 张牌的概率。

那么就是先抽出 \(i - 1\) 张数字牌,再抽出一张 joker 。

概率就是 :

\[f_i = \frac m {n + m - i +1}\prod_{k = 0} ^ {i - 2} \frac {n - k}{m + n - k} \]

一局游戏期望抽牌(轮)数量也就是:

\[\begin{aligned} E &= \sum_{i = 1}^{n + 1} i \times f_i\\ &= \sum_{i = 1}^{n + 1} i \times \frac m {n + m - i +1}\prod_{k = 0} ^ {i - 2} \frac {n - k}{m + n - k}\\ \end{aligned} \]

直接算这个式子会超时,我们可以先预处理后面的部分:

\[g_i = \prod_{k = 0} ^ {i - 2} \frac {n - k}{m + n - k} \]

可得

\[g_{i + 1} = g_i * \frac{n-i+1}{m + n - i + 1} \]

就转化成

\[E = \sum_{i = 1}^{n + 1} i \times \frac m {n + m - i +1}\times g_{i+1}\\ \]

期望局数

令 \(h_i\) 表示集合 \(S\) 内还缺 \(i\) 个数才凑够 \(n\) 时,期望再玩多少局。

显然答案就是 \(h_n\)。

若抽到了缺少的牌,那么就是:

\(\frac k {m + k} f_{k-1}\)

若抽到鬼牌,那么就是(加 1 是因为新的一局):

\(\frac m {m + k} {f_k + 1}\)

所以就是:

\[f_k = \frac m {m + k} (f_k + 1) + \frac k {m + k}*f_{k-1} \]

化简得:

\[f_k = f_{k - 1} + \frac m k \]

初始 \(f_0 = 1\) 。

因为即使你的集合内的数已经凑够了,你也要抽到 joker 才能停止。

最后答案就是

\[ans = E \times f_n \]

温馨提示

建议预处理逆元(我最开始没有预处理虽然本地没超时但测评会T)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 998244353;
const int N = 4e6 + 10;
ll n, m, w[N], ans1 = 0, ans2 = 0;
ll pr[N], ip[N], rv[N];
inline ll mpow(ll x, ll k){
    ll ans = 1;
    while(k){
        if(k & 1) ans = ans * x % mod;
        k >>= 1;
        x = x * x % mod;
    }
    return ans;
}
void pre(int n){
    pr[0] = 1;
    for(int i = 1; i <= n; ++i) pr[i] = pr[i - 1] * i % mod;
    ip[n] = mpow(pr[n], mod - 2);
    for(int i = n - 1; i >= 1; --i) ip[i] = ip[i + 1] * (i + 1) % mod;
    for(int i = 1; i <= n; ++i) rv[i] = ip[i] * pr[i - 1] % mod;
}
void op(){
    w[1] = 1;
    for(int i = 1; i <= n + 1; ++i){
        w[i + 1] = w[i] * (n - i + 1) % mod * rv[n + m - i + 1] % mod;
        ans1 = (ans1 + i * m % mod * rv[n + m - i + 1] % mod * w[i] % mod) % mod;
    }
    ans2 = m + 1;
    for(int i = 2; i <= n; ++i){
        ans2 = (ans2 + m * rv[i] % mod) % mod;
    }
}
int main(){
    cin>> n >> m;
    pre(n + m + 1);
    op();
    cout<<ans1 * ans2 % mod;
    return 0;
}

标签:frac,int,题解,ll,times,Shuffles,ans,Cards,mod
From: https://www.cnblogs.com/hfjh/p/17634942.html

相关文章

  • CF1858A Buttons题解
    思路我们可以让两人先拿\(c\)里面的,因为\(a\)和\(b\)肯定是自己的,那么公共的“我”也要抢的越多越好,所以我们都要先拿\(c\)里面的。如果\(c\)是奇数,那么先手一定多拿\(1\)个\(c\)里面的,相当于先手可以拿\(a+1\)个,后手可以拿\(b\)个;如果\(c\)是偶数,那么两......
  • CF1858C Yet Another Permutation Problem 题解
    思路这个题是一个简单的构造题。竟然比T2简单,也是少见我们可以首先从\(1\)开始不断乘以\(2\),像这样:\(1,2,4,8,16\cdots,2^x\),直到什么时候超过\(n\)就停止。这样相邻两个数字就可以凑出\(1,2,4,6,\cdots,2^{x-1}\),保证两两不同。然后我们可以从\(3\)开始不......
  • 2023“钉耙编程”中国大学生算法设计超级联赛(9)- 1003 Reasoning 题解
    题目翻译基本符号有一推理系统,其中有这些符号:括号\((\)和\()\);逻辑连接词\(\lnot\)和\(\rightarrow\);全称量词\(\forall\);变量\(u\simz\);常量\(a\sime\);函数\(f\simh\);谓词\(P\simT\)。这些符号是构成系统的基础,他们之间能够组合出一些其他概念:项(term......
  • P3572题解
    P3572题解题面翻译有\(n\)棵树排成一排,第\(i\)棵树的高度是\(d_i\)。有\(q\)只鸟要从第\(1\)棵树到第\(n\)棵树。当第\(i\)只鸟在第\(j\)棵树时,它可以飞到第\(j+1,j+2,\cdots,j+k_i\)棵树。如果一只鸟飞到一颗高度大于等于当前树的树,那么它的劳累值会增......
  • CF1060E Sergey and Subway 题解
    题面由题意可知,在原图中经过边数为\(2\)的一对点,在新图中经过边数为\(1\)。所以每对点在新图中的距离为:\[\begin{aligned}\lceil\frac{dis(i,j)}{2}\rceil=\frac{dis(i,j)+dis(i,j)\;mod\;2}{2}\end{aligned}\]那么我们只需在原图上求出任意两点距离之和并加上\(dis......
  • 国标GB28181视频监控平台EasyGBS国标平台无法播放,抓包返回ICMP的问题解决方案
    国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台,可实现的视频功能包括:实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的......
  • winform窗体闪烁问题解决方式
    winform窗体闪烁问题解决方式1、使用窗体双缓冲SetStyle(ControlStyles.UserPaint|ControlStyles.AllPaintingInWmPaint|ControlStyles.OptimizedDoubleBuffer,true);UpdateStyles();窗体的DoubleBuffered 指示是否对控件进行双缓存处理。2、使用CreateParams的使用......
  • CF1858C Yet Another Permutation Problem 题解
    杂言赛时想到做法,结果调code把自己心态调炸了,所以来写一篇题解(恼)。另:此题与P9345夕阳西下几时回几乎相同,可以此练手。另另:本题多测,多测不清空,爆零两行泪。题意翻译\(a_1,a_2,\dots,a_n\)是\(1\)至\(n\)的一个排列,记\(d_i=\gcd(a_i,a_{i\bmodn+1})\)。构造一个......
  • CF1188D Make Equal 题解
    题意给定\(n\)个数\(a_1,a_2,\cdots,a_n\),每次操作可以给其中的一个数加上\(2\)的非负整数次幂。求最小的操作次数,使得这\(n\)个数相等。题解首先考虑如何计算操作次数,设\(maxa=\max\limits_{i=1}^{n}a_i\),如果我们把这\(n\)个数操作成了数\(x\)(\(x\gemax......
  • [ARC096E] Everything on It 题解
    题意对于集合\({1,2,\cdots,n}\),求它的子集族中,有多少个满足:任意两个子集互不相同;\(1,2,\cdots,n\)都在其中至少出现了\(2\)次。\(n\le3000\),答案对\(M\)取模。题解第一个限制形同虚设,下面着重考虑第二个限制。考虑到第二个限制集合的每个元素都是等价的,考虑二项......