【SHOI 2002】百事世界杯之旅 (BSOI4841)
2017-02-21 17:22
357 查看
【SHOI 2002】百事世界杯之旅
Description
……在2003年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可以参加百事世界杯之旅的抽奖活动,获取球星背包、随身听,更可以赴日韩观看世界杯。还不赶快行动!……”你关上电视,心想:假设有n个不同球星的名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?
Input
输入一个数字n,2≤n≤33,表示不同球星名字的个数。
Output
输出凑齐所有的名字平均需要购买的饮料瓶数。如果是一个整数则直接输出。否则就用下面样例中的格式分别输出整数部分和小数部分。分数必须是不可约的。
Sample Input
5
Sample Output
11(5/12)
Hint
输出说明:先输出整数部分,若有小数部分,用括号把不可约分式括起来
Solution
一道数学期望的题型,从n种数中选出n个不同数的期望次数。
我们可以知道,第一个球星抽到的概率是1,第n个是1/n。那么我们要从k个到k+1个球星的概率为(n-k)/n,所以期望为n/(n-k)。
所以我们得出,ANS=n*(1/1+1/2+1/3+…L…+1/n)
。
CODE
代码很短,但是蒟蒻的代码相当乱。(参与分数计算的都要开long long,整型一定会爆。。。)#include<iostream> #include<cstdio> using namespace std; long long a,b,p; long long gcd(long long x,long long y){if(x<y){y-=x;return gcd(x,y);}if(x>y){x-=y;return gcd(x,y);}return x;} //gcd约分 int main(){ int n,i;cin>>n;a=1;b=1; for(i=2;i<=n;i++){ a=a*i+1*b;b*=i; p=a;a/=gcd(a,b);b/=gcd(p,b);//计算 } a*=n; if(a%b==0)cout<<a/b; else { cout<<a/b;a-=b*(a/b); cout<<'('<<a/gcd(a,b)<<'/'<<b/gcd(a,b)<<')';//输出 } return 0; }
相关文章推荐
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- 【SHOI 2002】百事世界杯之旅 (BSOI4841)
- ●洛谷P1291 [SHOI2002]百事世界杯之旅
- [SHOI2002]百事世界杯之旅
- [SHOI2002]百事世界杯之旅(概率期望+Refun的胡策)
- luogu P1291 [SHOI2002]百事世界杯之旅
- 【SHOI 2002】百事世界杯之旅 概率期望
- P1291 [SHOI2002]百事世界杯之旅