495. Kids and Prizes
Time limit per test: 0.25 second(s)
Memory limit: 262144 kilobytes
Memory limit: 262144 kilobytes
input: standard
output: standard
output: standard
ICPC (International Cardboard Producing Company) is in the business of producing cardboard boxes. Recently the company organized a contest for kids for the best design of a cardboard box and selected M winners. There are N prizes for the winners, each one carefully packed in a cardboard box (made by the ICPC, of course). The awarding process will be as follows:
- All the boxes with prizes will be stored in a separate room.
- The winners will enter the room, one at a time.
- Each winner selects one of the boxes.
- The selected box is opened by a representative of the organizing committee.
- If the box contains a prize, the winner takes it.
- If the box is empty (because the same box has already been selected by one or more previous winners), the winner will instead get a certificate printed on a sheet of excellent cardboard (made by ICPC, of course).
- Whether there is a prize or not, the box is re-sealed and returned to the room.
Input
The first and only line of the input file contains the values of
N and
M (
Output
The first and only line of the output file should contain a single real number: the expected number of prizes given out. The answer is accepted as correct if either the absolute or the relative error is less than or equal to 10
-9.
Example(s)
sample input | sample output |
5 7 | 3.951424 |
sample input | sample output |
4 3 | 2.3125 |
Online Contester Team © 2002 - 2010. All rights reserved. |
sample input | sample output |
5 7 | 3.951424 |
sample input | sample output |
4 3 | 2.3125 |
【题解】
只想说,,这题简单的吓死人,前提是你要读懂。。题目贼长,代码神水。。
有m个人,屋里n个盒子,最初每个盒子里都有奖品,现在m个人排队进去拿奖品,每次只能进一个人,每个人拿完奖品后盒子不动,重新封住;
也就是说盒子的数量一只都是n,问选中礼物的期望值是多少。
首先要知道期望值怎么算,高中学过的,每个物品的选中概率乘以物品数即为期望值;
这道题可以从盒子的角度想,考虑每个盒子不被选中的概率,因为盒子数不变,所以每个盒子不被选的概率一直都是(n-1)/n;对于某一个盒子,m个人都不选中它的概率就是
((n-1)/n)^m;所以n个盒子不被选中的期望就是 n*((n-1)/n)^m,所以选中的期望值就是 n- n*((n-1)/n)^m;
看懂了之后是不是觉得的确很水....
对于大数据的解法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int m,n;
double mul(double p,int k)
{
double pp=1;
while(k)
{
if(k&1) pp*=p;
p=p*p;
k>>=1;
}
return pp;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
double p=(double)(n-1)/n;
p=mul(p,m);
p*=n;
printf("%.9f\n",(double)(n-p));
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
double p=(double)(n-1)/n;
double ans=n-n*pow(p,m);
printf("%.9f\n",ans);
}
return 0;
}