UVA10288 Coupons
2015-08-16 21:58
232 查看
题意:n个物品(兑换券),每次从中选择一个(不取出),求期望多少次可以取遍所有的物品n<=33。
题解:先说一下概率吧:显然为1 * (n-1)/n * (n-2)/n * ... * 1/n 。这道题要求的期望一定不能直接取概率的倒数,因为直接取倒数的意义是一次取n个,期望多少次可以取遍,与题目不符。应该对于每一步取倒数然后相加作为答案。ans = 1 * n/(n-1) * n/(n-2) ... * n。实现的时候用long long,并且注意要不停地约分,不然会爆long long。
题解:先说一下概率吧:显然为1 * (n-1)/n * (n-2)/n * ... * 1/n 。这道题要求的期望一定不能直接取概率的倒数,因为直接取倒数的意义是一次取n个,期望多少次可以取遍,与题目不符。应该对于每一步取倒数然后相加作为答案。ans = 1 * n/(n-1) * n/(n-2) ... * n。实现的时候用long long,并且注意要不停地约分,不然会爆long long。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define LL long long LL n; LL fz, fm; //当前分子和分母 LL adz, adm; //增加的分子和分母 LL gcd(LL a, LL b) { if (!b) return a; return gcd(b, a%b); } void add() { LL g = gcd(fm, adm); LL t1 = fz*adm/g+adz*fm/g, t2 = fm/g*adm; fz = t1; fm = t2; g = gcd(fz, fm); fz/=g; fm/=g; } int lg(LL n) { int cnt = 0; while (n) ++cnt, n/=10; return cnt; } void put(int cnt, char c) { while (cnt>0) putchar(c), --cnt; } void print() { if (fz % fm == 0) { cout << fz << '\n'; return; } LL a = fz/fm , b = fz%fm, c = fm; put(lg(a) + 1, ' '); cout << b << '\n'; cout << a << ' '; put(lg(c), '-'); put(1, '\n'); put(lg(a) + 1, ' '); cout << c << '\n'; } int main() { while (cin >> n) { LL i; fz = 0; fm = 1; adz = 0; adm = 1; for (i = 0; i<n; ++i) { adz = n; adm = n - i; add(); } print(); } return 0; }
相关文章推荐
- 2015-8-16
- 第86讲:Scala中For表达式的生成器、定义和过滤器学习笔记
- 去掉UUID的小横线,如果你觉得不爽的话,哈哈
- 通过ssh登录远程服务器
- C#中图片.BYTE[]和base64string的转换
- python 如何压平嵌套
- Python Foundation - part one
- JavaScript中的this代表什么?
- JavaScript--利用setInterval或setTimeout实现背景颜色轮播
- hdu 5299 Circles Game 2015 Multi-University Training Contest 1
- 虚拟桌面发展的下一个里程碑,构建在CWC之上的软件定义工作空间
- map的4种常见的插入元素的方式及区别
- Haproxy解析
- 深入浅出数据分析 Head First Data Analysis Code 数据与代码
- 编译安装lamp架构(基于fastcgi)
- Little Zu Chongzhi's Triangles 5135(数学)
- 实模式和保护模式区别及寻址方式
- c++判断当前系统及编译器
- netty的心跳检测实现
- LeetCode_DP_Word Break II