题面

传送门

思路

首先,这道题是可以暴力min-max反演+NTT做出来的......但是这个不美观,我来讲一个做起来舒服一点的做法

一个非常basic的idea:我们发现在一只鸽子吃饱以后再喂给它的玉米都是“无效”的,并且我们如此认为,那么有效的玉米数量是确定的:$nk$

吃饱序列和投喂序列

那么,我们考虑一个序列$r_i$,表示第$i$次喂完玉米之前,有多少只鸽子是吃饱的,我们称之为吃饱序列

注意到本题中每只鸽子互不相同,因此我们再确定一个“有效喂鸽子操作”的序列,我们称之为投喂序列

特别注意:吃饱序列的构造虽然部分依赖于投喂序列,但是投喂序列的出现概率是完全依赖于吃饱序列的

显然,对于一组操作序列和吃饱序列,我们可以得到这组序列出现的总概率:$Prob=\prod_{i=1}^{nk}P_{r_i}$

其中$P_i$表示吃饱了$i$个的情况下,下一个投喂选到我们的目标鸽子的概率

那么我们现在实际上把投喂序列变成了可以由吃饱序列求出来,而吃饱序列的下一项又反过来由投喂序列确定,这么一个情况

我们如果要考虑总贡献,我们发现还需要考虑最终成功完成一次有效投喂(注意因为前面算的是概率,这里只要随便投喂一个没吃饱的鸽子就可以了)的期望时间

这个时间$T_i=E_{r_i}$,其中$E_i=\frac{n}{n-i}$,这里表示在$i$个鸽子吃饱的前提下的有效投喂期望时间

那么,我们可以得到我们在确定了一个吃饱序列和对应的投喂序列时最终答案的表达式:$Ans=\prod_{i=1}^{nk}P_{r_i}\sum_{i=1}^{nk} E_{r_i}$

上式的两个部分分别代表每一个投喂序列出现的概率,以及这个吃饱序列的期望完成时间

转化为DP

这个东西不好处理,因为我们没有办法直接知道每次成功投喂以后会不会使吃饱序列的下一项+1(也就是有一只鸽子吃饱了)

注意到贡献都只和$r_i$有关系,而和目前没吃饱的鸽子吃掉的玉米的分配没有关系!

所以我们大可以随意分配这些没吃饱的鸽子吃掉的玉米,下文中简称为白玉米

那么我们可以基于上面的表达式得到一个$dp$的做法:

设$f[i][j]$表示投喂了$i$次,有$j$个鸽子吃饱了的总贡献,$g[i][j]$则表示上述情况出现的概率(也就是只考虑表达式中含$P_{r_i}$的部分)

那么我们把表达式转化一下:

$f[i][j]=\sum_{\lbrace r\rbrace} \prod_{x=1}^{i}P_{r_x}\sum_{y=1}^{i} E_{r_y}$

$f[i][j]=\sum_{\lbrace r\rbrace} (P_j\prod_{x=1}^{i-1}P_{r_x})(E_j+\sum_{y=1}^{i-1} E_{r_y})$

$f[i][j]=P_j\ast(\sum_{\lbrace r\rbrace} \prod_{x=1}^{i-1}P_{r_x}\sum_{y=1}^{i-1} E_{r_y})+P_j\ast E_j\ast(\sum_{\lbrace r\rbrace} \prod_{x=1}^{i-1}P_{r_x})$

$f[i][j]=P_jf[i-1][j]+P_jE_jg[i-1][j]$

这样我们就完成了没有新鸽子吃饱的情况下的$f[i][j]$的转移

那么对于$g[i][j]$的转移,很显然是$g[i][j]=P_jg[i-1][j]$,不再赘述

对于新加入的玉米使得一只鸽子吃饱的情况,我们需要对目前存在的白玉米进行染色,此时染色的方案数显然为$\binom{i-jk}{k-1}$

所以对于从$f[i][j]$到$f[i+1][j+1]$的转移,只需要在上面的转移的基础上乘上上述组合系数即可

若仍有疑问,可以参见代码的实现

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#define MOD 998244353
#define ll long long
using namespace std;
inline int read(){int re=0,flag=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') flag=-1;ch=getchar();}while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();return re*flag;
}
inline int add(int a,int b){a+=b;if(a>=MOD) a-=MOD;return a;
}
inline void addd(int &a,int b){a+=b;if(a>=MOD) a-=MOD;
}
inline int qpow(int a,int b){int re=1;while(b){if(b&1) re=1ll*re*a%MOD;a=1ll*a*a%MOD;b>>=1;}return re;
}
int n,m,fac[1000010],finv[1000010],inv[1000010];
inline void init(){int i,len=1000000;fac[0]=fac[1]=finv[0]=finv[1]=inv[1]=1;for(i=2;i<=len;i++) inv[i]=1ll*(MOD-MOD/i)*inv[MOD%i]%MOD;for(i=2;i<=len;i++) fac[i]=1ll*fac[i-1]*i%MOD;finv[len]=qpow(fac[len],MOD-2);for(i=len;i>2;i--) finv[i-1]=1ll*finv[i]*i%MOD;
}
inline int C(int x,int y){if(x<0||y<0||x<y) return 0;return 1ll*fac[x]*finv[y]%MOD*finv[x-y]%MOD;
}
int f[100010][110],g[100010][110],p[100010],e[100010];
int main(){n=read();m=read();int i,j,tf,tg,tt;init();for(i=0;i<=n;i++) p[i]=inv[n-i],e[i]=1ll*n*inv[n-i]%MOD;f[0][0]=0;g[0][0]=1;for(i=0;i<n*m;i++){for(j=0;j*m<=i;j++){tg=1ll*g[i][j]*p[j]%MOD;tf=add(1ll*f[i][j]*p[j]%MOD,1ll*p[j]*e[j]%MOD*g[i][j]%MOD);tt=C(i-j*m,m-1);addd(f[i+1][j],tf);addd(g[i+1][j],tg);addd(f[i+1][j+1],1ll*tf*tt%MOD);addd(g[i+1][j+1],1ll*tg*tt%MOD);}}
//  for(i=0;i<=n*m;i++) for(j=0;j*m<=i;j++) cout<<i<<' '<<j<<' '<<f[i][j]<<' '<<g[i][j]<<'\n';cout<<(1ll*fac[n]*f[n*m][n]%MOD)<<'\n';
}

转载于:https://www.cnblogs.com/dedicatus545/p/10706279.html

[2018国家集训队][UOJ449] 喂鸽子 [dp+组合数学]相关推荐

  1. P2183 [国家集训队]【一本通提高组合数学】礼物

    [国家集训队]礼物 题目背景 一年一度的圣诞节快要来到了.每年的圣诞节小 E 都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小 E 心目中的重要性不同,在小 E 心中分量越重的人,收到的礼物会 ...

  2. 国家集训队论文分类整理[转]

    国家集训队论文分类整理 转自这里 dalao写的东西,是非常有学习价值的.反正noip不一定会用,但是对以后肯定有用的. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用&g ...

  3. 国家集训队论文分类整理

    国家集训队论文分类整理 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬 ...

  4. 国家集训队论文分类整理(转)

    国家集训队论文分类整理 ----------转自https://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html 距离ACM/I ...

  5. NOI 国家集训队论文集

    转载链接:http://blog.csdn.net/bright_xl/article/details/11084747 国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pól ...

  6. 【转载】国家集训队论文分类

    国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:& ...

  7. NOI国家集训队论文集

    国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:& ...

  8. 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...

    雷刚 发自 副中心  量子位 报道 | 公众号 QbitAI 第35届中国数学奥林匹克竞赛成绩公布. 同时也意味着新一届中国奥数国家集训队,正式集结. 60名中学生. 湖北贡献9人.广东7人,上海6人 ...

  9. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  10. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

最新文章

  1. 【连载】【黑金动力社区原创力作】《液晶驱动与GUI 基础教程》 --序言(一)
  2. [体感游戏]关于体感游戏的一些思考(三) --- 射击
  3. XML文件操作(C#)
  4. 【基于注解方式】Spring整合Kafka
  5. Linux内存管理:ARM64体系结构与编程之cache(1)
  6. SpringBoot基础教程1-1-2 配置文件介绍
  7. Linux 3.13.0删除了Netlink API函数genl_register_ops() / genl_unregister_ops()
  8. css----苹果移动端以及小程序滚动模块卡顿的处理
  9. android studio2.3.6,Android Studio 2.3 问题汇总 - 解决一切障碍,为了更好的时代
  10. elasticsearch 分组求和
  11. JAVA计算机毕业设计大学生二手物品交易网站演示记录2021Mybatis+系统+数据库+调试部署
  12. android 自定义view参数,Android自定义View:MeasureSpec的真正意义与View大小控制
  13. Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行
  14. Linux常用命令--压缩解压命令
  15. 云原生编程语言ballerina:hello-world
  16. [渝粤教育] 重庆工商职业学院 生活中的大数据 参考 资料
  17. ML-Agents案例之地牢逃脱
  18. 哦麦艾斯!AI设计的丑衣服将引领时尚?数据结构与算法代码面试题;将文件藏在图片里的隐写工具;蒙古语语音合成语料库
  19. 轻量化网络-SqueezeNet(2016)
  20. R语言剔除包含NA值的行

热门文章

  1. 通过代理上网,如何配置Outlook
  2. 公式编辑器中如何修改字体?
  3. ​大连商务英百家外语英语六级水平,适合报考BEC中级还是高级
  4. java单击按钮实现窗口隐藏
  5. 将image对象转成BufferedImage
  6. 人工智能在解放客服,还是在解散客服?
  7. 你真的会用微软输入法?
  8. AI开发者大会:2020年7月3日和7月4日CSDN重磅举办《百万人学AI》大会议程及其对应视频回放链接
  9. win7休眠设置在哪里_win7怎么开启休眠模式
  10. 如何开发手机商城app? 商城APP功能