这种题的一个常用转化是,只考虑所有有效的操作(比如在这题中喂一个没饱的鸽子),假设还剩\(k\)个元素可以进行有效操作,那么进行下一次有效操作的期望次数是\(\frac{n}{k}\)。

考虑这题,我们把每一次喂到的没饱的鸽子写成一个序列,那么这个序列的长度是\(nk\)。我们先假设鸽子是按从\(1\)到\(n\)的顺序依次饱的,最后再进行一些操作计算答案。

设\(f_{i,j}\)表示考虑序列中前\(i\)个元素,\(1\)到\(j\)的鸽子饱了的概率,\(g_{i,j}\)表示考虑序列中前\(i\)个元素,\(1\)到\(j\)的鸽子饱了的概率×期望操作次数。我们考虑这样DP:当我们希望放入一个数\(x\)时,如果\(x\)没饱,那么我们先填个\(0\)上去,如果\(x\)饱了,那么我们就在前面的\(0\)中再取出\(k-1\)个全部改为\(x\)。转移时,枚举下一位填\(0\)还是填\(j+1\)。如果是填\(0\),那么\(f'=f\times\frac{1}{n-j}\)(因为我们假设我们强制了这一位填某个数\(x\),最终到底填什么由后面的组合数来决定),\(g'=(g+\frac{n}{n-j}\times f_{i,j})\times\frac{1}{n-j}\)。如果填\(j+1\),那么在上述转移的基础上乘一个组合数\(\binom{i-jk}{k-1}\)。

最后答案是\(g_{nk,n}\times n!\),乘\(n!\)是因为\(g\)表示的是概率×期望操作次数,我们强制了鸽子是按从\(1\)到\(n\)的顺序依次饱的,这个条件贡献了\(\frac{1}{n!}\)的概率。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int mod=998244353;int f[N][55],g[N][55],fac[N],inv[N],ifac[N],s,n,k;int C(int n,int m) {if(m<0||n<m) return 0;return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}int add(int a,int b) { return a+b>=mod?a+b-mod:a+b; }
void inc(int &a,int b) { a=a+b>=mod?a+b-mod:a+b; }int main() {
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifcin>>n>>k,s=n*k;fac[0]=1;for(int i=1;i<=s;i++) fac[i]=1ll*fac[i-1]*i%mod;inv[1]=1;for(int i=2;i<=s;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;ifac[0]=1;for(int i=1;i<=s;i++) ifac[i]=1ll*ifac[i-1]*inv[i]%mod;f[0][0]=1;for(int i=0,x,y;i<s;i++)for(int j=0;j<n;j++)if(f[i][j]||g[i][j]) {inc(f[i+1][j],x=1ll*f[i][j]*inv[n-j]%mod);inc(g[i+1][j],y=1ll*add(g[i][j],1ll*n*inv[n-j]%mod*f[i][j]%mod)*inv[n-j]%mod);inc(f[i+1][j+1],1ll*x*C(i-j*k,k-1)%mod);inc(g[i+1][j+1],1ll*y*C(i-j*k,k-1)%mod);}printf("%lld\n",1ll*g[s][n]*fac[n]%mod);return 0;
}

转载于:https://www.cnblogs.com/gczdajuruo/p/10777115.html

[集训队作业2018]喂鸽子相关推荐

  1. UOJ#449. 【集训队作业2018】喂鸽子

    #449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...

  2. uoj#422. 【集训队作业2018】小Z的礼物

    uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...

  3. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  4. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  5. 【集训队作业2018】喂鸽子

    我的计数还是太差了-- 这道题现在知道三种做法. 1. 直接DP 首先显然需要min-max容斥(不知道请百度),不然很难算. 显然对于大小相同的集合答案一样,问题转化为求 \(f_c\) 即 \(c ...

  6. UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ449.html 题解 设 f(i) 表示给 i 只鸽子喂食使得至少一只鸽子被喂饱的期望次数,先 min-max容斥 一下. ...

  7. 【集训队作业2018】复读机

    即使是一道菜题,也掩盖不了窝生成函数弱的事实. 窝看到题目只想到了DP,还是生成函数不够熟.然后直到神仙WWJ提醒我用生成函数-- 首先是排列,那就可以写成指数型生成函数的优美形式.直接表示成exp吧 ...

  8. 【集训队作业2018】围绕着我们的圆环

    我貌似开始爆OJ了 主要是因为预处理的范围写小,以及第一次写带删除线性基,然后就调了好久/cy 如果把 \(A\) 看做一堆列向量,然后对于 \(C\) 的一个列向量 \(V\) ,以及对应列的 \( ...

  9. 【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】

    传送门 单位根反演听着高级,其实没啥技术含量-- 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样: 1n∑i=0n−1ωnik=[k∣n]\frac{1}{n}\sum_{i=0}^{n-1} ...

  10. [集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

    传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n],设fA(1,n)=pa,fB(1,n)=pbf_A(1,n)=p_a,f_B(1 ...

最新文章

  1. Linux-profile、bashrc、bash_profile之间的区别和联系
  2. pc 页面在移动端怎么获取放大倍数、_百度移动搜索开放适配服务的3种方法
  3. 玩游戏也能学Python?!论Python的正确打开方式
  4. UCMap移动GIS 时空地图GIS
  5. php打印预览jquery,php 实现打印预览的功能
  6. AndroidStudio_安卓原生开发_自定义单选列表Spinner绑定自定义数据类型---Android原生开发工作笔记143
  7. python tkinter text改变文本字体颜色_Python3 tkinter基础 Button text,fg 按钮上显示的文字 文字的颜色...
  8. [数据仓库]我理解的数据中台
  9. BGP超级失误:Verizon 搞垮 Cloudflare 和 AWS 等巨头,导致“连锁灾难性故障”
  10. spss分析方法-判别分析
  11. uctools.php,Discuz曝出安全隐患 XSS脚本漏洞和uctools.php
  12. python下载豆丁文档_doc_downloader
  13. Epic Games Launcher 无效驱动器E
  14. VOC2007/2012数据集解析
  15. 阿里文学 php,唐家三少质问阿里文学:骂我可以忍为何辱我亡妻
  16. 10 大开源免费的项目管理软件推荐
  17. 组件封装 - 省市区联动组件
  18. slice与split的区别
  19. Java中的四种Reference
  20. iOS程序员如何成为编程高手,并以此创业

热门文章

  1. JS瀑布流插件 -- salvattore
  2. 电脑变wifi 用电脑建立无线网
  3. nexus+4+android+6,Android 4.1.1+Nexus S安装BT5
  4. 映像劫持 Image Hijack
  5. 适用于开发者的开源分布式即时通讯系统
  6. ESP32|基于ESP32制作的低成本、可拓展性高的NES游戏机(1)(开源ESP32 NES模拟器)-效果演示及介绍
  7. 内存颗粒位宽和容量_SDRAM内存模组的物理Bank与芯片位宽(高手进阶,终极内存技术指南——完整/进阶版)...
  8. stm32 系统进入stop模式_STM32开发笔记78: 2种STOP模式的唤醒方法
  9. 论证可行性有哪几个方面
  10. [Java web编程]第2章 HTML与css网页开发基础(动画)