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 |
这道题看上去介绍很繁琐,输出的精度也不低,似乎是道很麻烦的题目,但实际上就是一个式子可以解决问题。如果正向去dp,那么原则上是要向前推才能得到期望值,这样是可以做出来,只是还有更好的方法。既然东西要放进去,我们反过来求不取的礼物的期望不是也可以间接得到礼物的期望么。本质就是n-n*((n-1)/n)^m。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int N,M;
int main()
{
while(scanf("%d%d",&N,&M)!=EOF){
double P,S;
P=(double)(N-1)/(double)N;
S=N-N*pow(P,M);//核心表达式
printf("%.9lf\n",S);
}
return 0;
}