首页 > 其他分享 >[20联赛集训day8]高考考

[20联赛集训day8]高考考

时间:2024-09-27 13:45:59浏览次数:8  
标签:20 day8 ll ge 集合 frac binom 集训 mod

[20联赛集训day8]高考考

芝士:概率分析、min-max 容斥、组合数学、推柿子。

有一个长度为 \(n\) 的初始全部是 \(1\) 的序列,要求做 \(m\) 次操作,每次操作随机选择一个数字将它加 \(1\),选到第 \(i\) 个数字的概率为 \(\frac{a_i}{\sum_{j=1}^{n} a_j}\)。

考虑最终形成的序列,我们可以发现形成每种序列的概率是一样的,证明:生成一个序列 \(A\) 的概率为:

\[\frac{\prod(a_i-1)!}{\frac{(n+m-1)!}{(n-1)!}}\cdot \frac{m!}{\prod{(a_i-1)!}}=\frac{1}{\binom{n+m-1}{n-1}}=\frac{(n-1)!m!}{(n+m-1)!} \]

求前 \(k\) 大的数的期望可以转化为求第 \(k\) 大的数期望。

由于第 \(k\) 大的数的期望不好求,我们可以用 min-max 容斥转化为求所有集合的最小值的期望。

\[E(kthmax\{S\})=\sum_{T\subseteq S} (-1)^{|T|-k}\binom{|T|-1}{k-1}E(\min_{j\in T} x_j) \]

求一个 \(s\) 集合最小的数就是求集合第 \(|s|\) 大的数。

设 \(f_i\) 表示含有 \(i\) 个数的集合中,第 \(i\) 大的数的期望,然而这不好算。我们容易算出第 \(i\) 大的数大于等于 \(j\) 的方案数,即集合所有数都 \(\ge j\) 的方案数。用插板法。先预先抽走 \(i(j-1)\) 个空,然后插上 \(n-1\) 个板把全局分成 \(n\) 个部分,最后把集合的部分放回那些板就能保证集合 \(\ge j\)。

\[f_{i,j}=\binom{n+m-1-i(j-1)}{n-1} \]

\[f_i=\sum_{j=1}^{n+m} f_{i,j} \]

这个式子表示集合最小的数 \(\ge j\) 的方案数总和,\(\ge j\) 的方案数会被 $\ge 1\sim j $ 都算一次,一共 \(j\) 次,这样一个 \(\ge j\) 的方案对答案的贡献就是 \(j\) 了。因此可以表示长度为 \(i\) 的集合最小的数的期望。

那么我们现在已经求出了长度为 \(i\) 的集合最小的数的期望,把它带进 min-max 容斥公式里可以得到(\(g_j=k\) 表示全局第 \(k\) 大的数的期望):

\[g_k=\sum_{i} (-1)^{i-k} \binom{i-1}{k-1} f_i\binom{n}{i} \]

还要乘上 \(\binom{n}{i}\) 的原因是有这么多种长度为 \(i\) 的集合。

\[ans_k=\sum_{i\le k} g_i \]

答案很显然。

Code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
// #define DEBUG
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define isdigit(x) (x>='0'&&x<='9')
using namespace std;
typedef long long ll;
const int N=5e3+5,mod=1e9+7,NN=1e4;
int n,m;
ll jc[N<<1];
ll inv[N<<1];
ll ksm(ll a,ll b){
    ll s=1;
    while(b){
        if(b&1) s=s*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return s;
}
void init(){
    jc[0]=1;
    rep(i,1,NN) jc[i]=jc[i-1]*i%mod;
    inv[NN]=ksm(jc[NN],mod-2);
    for(int i=NN-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
ll sub(ll a,ll b){return ((a-b)%mod+mod)%mod;}
ll add(ll a,ll b){return (a+b)%mod;}
ll f[N],g[N];
ll comb(ll n,ll m){
    if(n<m) return 0;
    return jc[n]*inv[m]%mod*inv[n-m]%mod;
}
int main(){
    #ifdef DEBUG
    freopen("in.txt","r",stdin);
    freopen("my.out","w",stdout);
    #endif
    sf("%d%d",&n,&m);
    init();
    rep(i,1,n){
        for(int j=0;j<=m;j++){
            f[i]=add(f[i],comb(n+m-1-i*j,n-1));
        }
    }
    rep(k,1,n){
        rep(i,k,n){
            ll t=f[i]*comb(i-1,k-1)%mod*comb(n,i)%mod;
            if((i-k)&1) g[k]=sub(g[k],t);
            else g[k]=add(g[k],t);
        }
    }
    rep(i,2,n) g[i]=add(g[i],g[i-1]);
    rep(i,1,n) g[i]=g[i]*jc[n-1]%mod*jc[m]%mod*inv[n+m-1]%mod,pf("%lld\n",g[i]);
}

标签:20,day8,ll,ge,集合,frac,binom,集训,mod
From: https://www.cnblogs.com/liyixin0514/p/18435534

相关文章

  • 【20联赛集训day10】排列
    【20联赛集训day10】排列一个长度为\(n\)的排列,每次操作删除所有存在相邻的数字比它更大的数字,问执行\(k\)次操作后剩下恰好一个数的排列方案数。首先因为每次删除至少删一半的数字,所以最多删\(\log\)次。对于一个排列,我们可以发现把序列按最大值劈开,左右两边互不干扰,成......
  • P2090 数字对
    P2090数字对不是,这不是黄题吗,鉴定为我太菜了考虑这东西长得像辗转相除法。最终结果一定是\((n,B)\)这样子的。那么它一定是由\((n-B,B)\)转移过来。对于\((a,b)\)如果\(a>b\)它会变成\((a-b,b)\),否则是\((a,b-a)\)。于是也许我们可以枚举\(B\),把\(a-b\)这个操作......
  • P2375 [NOI2014] 动物园
    P2375[NOI2014]动物园题意是对于每个前缀,求前缀后缀不交的且前后缀相等的前后缀数量数组,\(1\lelen\le10^6\)。考虑先求出正常的\(next\)数组,KMP\(O(len)\)求解。对于\(next'\)数组,可以由前一个数的\(next'\)数组转移,如果新数大小超过了\(\frac{i}{2}\)就跳到前......
  • P3195 [HNOI2008] 玩具装箱
    P3195[HNOI2008]玩具装箱\(dp_i\)表示前\(i\)个玩具的最小代价。\(s_i=\sum_{j\lei}c_i+1\)。设\(L'=L+1\)。\(dp_i=\min_{j<i}\{dp_j+(s_i-s_j-L')^2\}\)\(dp_i-s_i'^2+2s_iL'=\min_{j<i}\{dp_j+(s_j'+L)^2-2s_is_j\}\)\(b=y......
  • 自学网络安全(黑客技术)2024年 90天学习计划
    ......
  • 2024年9月27日历史上的今天大事件早读
     1540年09月27日罗马教皇正式批准耶稣会1605年09月27日吉尔霍尔姆战役爆发1825年09月27日世界第一条铁路在英国正式通车1840年09月27日美国海军战略思想家马汉出生1858年09月27日天地会起义,建立大成国1910年09月27日橡胶股灾亡国录1913年09月27日孙中山组建中华革命党......
  • [SWPUCTF 2021 新生赛]easy_md5
    分析一下代码, name不等于password,namd,md5值和password,md5值相等。get传参name,post传参password。$name!=$password&&md5($name)==md5($password)属于MD5绕过中的php==弱类型绕过有两个办法,第一个办法就是importrequests#网站的URLurl="http://node7.a......
  • [GXOI/GZOI2019] 逼死强迫症 题解
    看到\(N\leq2\times10^9\)的范围,一眼矩阵快速幂优化DP。首先考虑朴素DP怎么写。根据题目所给信息,我们设\(dp_{i,0}\)表示前面\(i\)个方砖,并且已经使用了\(2\)个\(1\times1\)的方砖,\(dp_{i,1}\)则表示前面\(i\)个方砖,没有使用任何一个\(1\times1\)的方砖。......
  • [CERC2015] Digit Division 题解
    \(O(n^2)\)做法和大部分人最开始一样,我也想的是DP。设\(dp_i\)表示用前面\(i\)个字符拆分得到的答案。既然是统计方案数,我们肯定是根据前面的答案累加。考虑在\([1,i-1]\)中选择一个\(j\),如果\([j+1,i]\)的字符组成的数字能够被\(m\)整除,那么\(dp_i\)就可以累加......
  • [JLOI2015] 有意义的字符串 题解
    拿到题目,我们首先分析一下这个奇怪的式子:\[\lfloor(\frac{b+\sqrt{d}}{2})^n\rfloor~\text{mod}~p\]重点肯定是在里面的那个式子里面,最显眼的肯定也就是那个\(\sqrt{d}\),根据整体形式,我们可以联系一元二次方程的求根公式\(x=-\dfrac{-b\pm\sqrt{b^2-4ac}}{2a}\),这里也是一......