题意:有n个鸽子,你每秒随机喂一只鸽子,每只鸽子吃k次就饱了。求期望多少秒之后全饱了。n <= 50, k <= 1000。

解:有两种做法。一种直接DP的n2k做法在这。我用的是Min-Max容斥 + NTT优化DP。

先Min-Max容斥,由于鸽子是等价的,所以相当于求m只鸽子期望多少秒之后有一只饱了。

讲不清楚...看题解吧。

注意题解中m个盒子的答案为什么放了i + 1个球,这是因为我们把最后一个球拿出来考虑了。所以唯一放满k个球的盒子的贡献是1 / (k - 1)!

  1 #include <bits/stdc++.h>
  2
  3 const int MO = 998244353;
  4 const int N = 50010;
  5
  6 int n, K, fac[N], inv[N], invn[N];
  7 int f[55][N], g[55][N], A[N * 4], B[N * 4], r[N * 4];
  8
  9 inline int C(int n, int m) {
 10     if(n < 0 || m < 0 || n < m) return 0;
 11     return 1ll * fac[n] * invn[m] % MO * invn[n - m] % MO;
 12 }
 13
 14 inline int qpow(int a, int b) {
 15     int ans = 1;
 16     while(b) {
 17         if(b & 1) ans = 1ll * ans * a % MO;
 18         a = 1ll * a * a % MO;
 19         b = b >> 1;
 20     }
 21     return ans;
 22 }
 23
 24 inline int Inv(int x) {
 25     return qpow(x, MO - 2);
 26 }
 27
 28 inline void prework(int n) {
 29     static int R = 0;
 30     if(R == n) return;
 31     R = n;
 32     int lm = 1;
 33     while((1 << lm) < n) lm++;
 34     for(int i = 0; i < n; i++) {
 35         r[i] = (r[i >> 1] >> 1) | ((i & 1) << (lm - 1));
 36     }
 37     return;
 38 }
 39
 40 inline void NTT(int *a, int n, int f) {
 41     prework(n);
 42     for(int i = 0; i < n; i++) {
 43         if(i < r[i]) {
 44             std::swap(a[i], a[r[i]]);
 45         }
 46     }
 47     for(int len = 1; len < n; len <<= 1) {
 48         int Wn = qpow(3, (MO - 1) / (len << 1));
 49         if(f == -1) Wn = Inv(Wn);
 50         for(int i = 0; i < n; i += (len << 1)) {
 51             int w = 1;
 52             for(int j = 0; j < len; j++) {
 53                 int t = 1ll * a[i + len + j] * w % MO;
 54                 a[i + len + j] = (a[i + j] - t) % MO;
 55                 a[i + j] = (a[i + j] + t) % MO;
 56                 w = 1ll * w * Wn % MO;
 57             }
 58         }
 59     }
 60     if(f == -1) {
 61         int inv = Inv(n);
 62         for(int i = 0; i < n; i++) {
 63             a[i] = 1ll * a[i] * inv % MO;
 64         }
 65     }
 66     return;
 67 }
 68
 69 int main() {
 70
 71     scanf("%d%d", &n, &K);
 72
 73     fac[0] = inv[0] = invn[0] = 1;
 74     fac[1] = inv[1] = invn[1] = 1;
 75     for(int i = 2; i <= n * K; i++) {
 76         fac[i] = 1ll * fac[i - 1] * i % MO;
 77         inv[i] = 1ll * inv[MO % i] * (MO - MO / i) % MO;
 78         invn[i] = 1ll * invn[i - 1] * inv[i] % MO;
 79     }
 80
 81     int len = 1;
 82     while(len <= n * K) len <<= 1;
 83     g[0][0] = 1;
 84     memcpy(B, invn, K * sizeof(int));
 85     NTT(B, len, 1);
 86     for(int i = 1; i <= n; i++) {
 87         /*for(int j = 0; j <= i * K; j++) {
 88             /// g[i][j] f[i][j]
 89             for(int k = 0; k < K && k <= j; k++) {
 90                 g[i][j] = (g[i][j] + 1ll * g[i - 1][j - k] * invn[k] % MO) % MO;
 91                 f[i][j] = (f[i][j] + 1ll * f[i - 1][j - k] * invn[k] % MO) % MO;
 92             }
 93             if(j >= K) f[i][j] = (f[i][j] + 1ll * g[i - 1][j - K] * invn[K - 1] % MO) % MO;
 94         }*/
 95         memcpy(A, g[i - 1], n * K * sizeof(int));
 96         memset(A + n * K, 0, (len - n * K) * sizeof(int));
 97         NTT(A, len, 1);
 98         for(int j = 0; j < len; j++) {
 99             A[j] = 1ll * A[j] * B[j] % MO;
100         }
101         NTT(A, len, -1);
102         for(int j = 0; j <= i * K; j++) {
103             g[i][j] = A[j];
104         }
105         memcpy(A, f[i - 1], n * K * sizeof(int));
106         memset(A + n * K, 0, (len - n * K) * sizeof(int));
107         NTT(A, len, 1);
108         for(int j = 0; j < len; j++) {
109             A[j] = 1ll * A[j] * B[j] % MO;
110         }
111         NTT(A, len, -1);
112         for(int j = 0; j <= i * K; j++) {
113             f[i][j] = A[j];
114             if(j >= K) {
115                 f[i][j] = (f[i][j] + 1ll * g[i - 1][j - K] * invn[K - 1] % MO) % MO;
116             }
117         }
118     }
119
120     int ans = 0;
121     for(int i = 1; i <= n; i++) {
122         int temp = 0;
123         for(int j = K - 1; j <= i * K; j++) {
124             temp = (temp + 1ll * fac[j - 1] * f[i][j] % MO * qpow(inv[i], j) % MO * j % MO) % MO;
125         }
126         temp = 1ll * temp * n % MO * inv[i] % MO * C(n, i) % MO;
127         if(i & 1) {
128             ans = (ans + temp) % MO;
129         }
130         else {
131             ans = (ans - temp) % MO;
132         }
133     }
134     printf("%d\n", (ans + MO) % MO);
135     return 0;
136 }

AC代码

转载于:https://www.cnblogs.com/huyufeifei/p/10942703.html

UOJ#449 喂鸽子相关推荐

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

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

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

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

  3. 【UOJ#386】【UNR#3】鸽子固定器(贪心)

    [UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...

  4. UOJ#386. 【UNR #3】鸽子固定器(链表)

    题意 题目链接 为了固定S**p*鸽鸽,whx和zzt来到鸽具商店选购鸽子固定器. 鸽具商店有 nn 个不同大小的固定器,现在可以选择至多 mm 个来固定S**p*鸽鸽.每个固定器有大小 sisi 和 ...

  5. UOJ.386.[UNR #3]鸽子固定器(贪心 链表)

    题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...

  6. uoj#386. 【UNR #3】鸽子固定器(乱搞)

    传送门 题解 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i ...

  7. uoj 117 欧拉回路

    1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数   1.1 对于有向边---建立单向边判断 ...

  8. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  9. 研究生招生多次被“放鸽子”:给学生几点诚信方面的建议

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:张吴明科学网博客 研究生招生已经数次遇到放鸽子的情况,学生在联 ...

  10. 灰鸽子敢说自己不是病毒?

    用google检索"灰鸽子病毒",检索到约 268,000 项结果:用baidu检索"灰鸽子病毒",找到相关网页约548,000篇.灰鸽子自诞生之日起,就被反病 ...

最新文章

  1. Android应用开发——文件目录
  2. Kali桥接模式DHCP自动获取IP失败(VMware)
  3. C++编码类定义的规则
  4. web.py+xheditor+ ajaxfileupload+新浪sae图片上传
  5. java更改svg图片颜色_如何使用Leaflet库填充SVG图像中的颜色
  6. TIDB介绍 新数据库趋势
  7. 高斯过程和高斯过程回归
  8. CF125E MST Company
  9. 70个具有商业实战性的精品Android源码
  10. 【Docker】seaweedfs的搭建与使用
  11. UiPath PDF拆分与合并
  12. 在Azure上实现Python应用和数据现代化第1部分:简介
  13. css控制文本的行高
  14. 041 柯西中值定理证明及型三(ξ与a,b可分离)
  15. python图像代码怎么变成图像_如何让一张图片变成二值图像?python+opencv图像处理...
  16. 爬虫python编程与cvi编程_无编程经验学习Python做爬虫,目前遇到困难,请各位指点下?...
  17. 高等工程数学期末试题2015
  18. Springboot配置多个视图解析器,项目同时有jsp和html
  19. [2018.04.17][水][日志][5][#160][虚伪的椰子树][简直丧心病狂][背景-amp;amp;gt;][请求题中福利][递归+纯模拟一只]
  20. 读书与思考(张五常)

热门文章

  1. 分享多引擎样本查毒网站+多款杀软在线查毒网站
  2. CentOS7安装DockerCentOS7安装DockerCompose
  3. 2022-09-29:在第 1 天,有一个人发现了一个秘密。 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后, 每天 给一个新的人 分享 秘密。 同时给你一个整数 forg
  4. ad网络标号怎么用_altium designer网络标号的作用范围
  5. 页式存储中的逻辑地址与物理地址之间的解析过程
  6. Outlook邮件目录中存在部分英文和中文,修改为中文的方法
  7. 地图染色(四色定理)问题
  8. mysql 加权_mysql/stats:加权平均值以突出平均值的差异
  9. 引用 孙悟空的师傅菩提祖师的真实真份和镇元大仙辈份排名+四大灵猴
  10. 平面设计完全手册_什么是平面设计,做平面设计都要了解哪些基础知识点?