UOJ#449 喂鸽子
题意:有n个鸽子,你每秒随机喂一只鸽子,每只鸽子吃k次就饱了。求期望多少秒之后全饱了。n <= 50, k <= 1000。
解:有两种做法。一种直接DP的n2k做法在这。我用的是Min-Max容斥 + NTT优化DP。
先Min-Max容斥,由于鸽子是等价的,所以相当于求m只鸽子期望多少秒之后有一只饱了。
讲不清楚...看题解吧。
注意题解中m个盒子的答案为什么放了i + 1个球,这是因为我们把最后一个球拿出来考虑了。所以唯一放满k个球的盒子的贡献是1 / (k - 1)!
![](/assets/blank.gif)
![](/assets/blank.gif)
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 喂鸽子相关推荐
- UOJ#449. 【集训队作业2018】喂鸽子
#449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...
- UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT
原文链接www.cnblogs.com/zhouzhendong/p/UOJ449.html 题解 设 f(i) 表示给 i 只鸽子喂食使得至少一只鸽子被喂饱的期望次数,先 min-max容斥 一下. ...
- 【UOJ#386】【UNR#3】鸽子固定器(贪心)
[UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...
- UOJ#386. 【UNR #3】鸽子固定器(链表)
题意 题目链接 为了固定S**p*鸽鸽,whx和zzt来到鸽具商店选购鸽子固定器. 鸽具商店有 nn 个不同大小的固定器,现在可以选择至多 mm 个来固定S**p*鸽鸽.每个固定器有大小 sisi 和 ...
- UOJ.386.[UNR #3]鸽子固定器(贪心 链表)
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...
- uoj#386. 【UNR #3】鸽子固定器(乱搞)
传送门 题解 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i ...
- uoj 117 欧拉回路
1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数 1.1 对于有向边---建立单向边判断 ...
- UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...
- 研究生招生多次被“放鸽子”:给学生几点诚信方面的建议
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:张吴明科学网博客 研究生招生已经数次遇到放鸽子的情况,学生在联 ...
- 灰鸽子敢说自己不是病毒?
用google检索"灰鸽子病毒",检索到约 268,000 项结果:用baidu检索"灰鸽子病毒",找到相关网页约548,000篇.灰鸽子自诞生之日起,就被反病 ...
最新文章
- Android应用开发——文件目录
- Kali桥接模式DHCP自动获取IP失败(VMware)
- C++编码类定义的规则
- web.py+xheditor+ ajaxfileupload+新浪sae图片上传
- java更改svg图片颜色_如何使用Leaflet库填充SVG图像中的颜色
- TIDB介绍 新数据库趋势
- 高斯过程和高斯过程回归
- CF125E MST Company
- 70个具有商业实战性的精品Android源码
- 【Docker】seaweedfs的搭建与使用
- UiPath PDF拆分与合并
- 在Azure上实现Python应用和数据现代化第1部分:简介
- css控制文本的行高
- 041 柯西中值定理证明及型三(ξ与a,b可分离)
- python图像代码怎么变成图像_如何让一张图片变成二值图像?python+opencv图像处理...
- 爬虫python编程与cvi编程_无编程经验学习Python做爬虫,目前遇到困难,请各位指点下?...
- 高等工程数学期末试题2015
- Springboot配置多个视图解析器,项目同时有jsp和html
- [2018.04.17][水][日志][5][#160][虚伪的椰子树][简直丧心病狂][背景-amp;amp;gt;][请求题中福利][递归+纯模拟一只]
- 读书与思考(张五常)
热门文章
- 分享多引擎样本查毒网站+多款杀软在线查毒网站
- CentOS7安装DockerCentOS7安装DockerCompose
- 2022-09-29:在第 1 天,有一个人发现了一个秘密。 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后, 每天 给一个新的人 分享 秘密。 同时给你一个整数 forg
- ad网络标号怎么用_altium designer网络标号的作用范围
- 页式存储中的逻辑地址与物理地址之间的解析过程
- Outlook邮件目录中存在部分英文和中文,修改为中文的方法
- 地图染色(四色定理)问题
- mysql 加权_mysql/stats:加权平均值以突出平均值的差异
- 引用 孙悟空的师傅菩提祖师的真实真份和镇元大仙辈份排名+四大灵猴
- 平面设计完全手册_什么是平面设计,做平面设计都要了解哪些基础知识点?