神奇stl- - Little Pony and Expected Maximum
2015-10-18 19:31
405 查看
F - Little Pony and Expected Maximum
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice CodeForces
453A
Description
Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she kept losing. Having returned to the castle, Twilight Sparkle became interested in the dice that were used in the game.
The dice has m faces: the first face of the dice contains a dot, the second one contains two dots, and so on, the m-th face
contains mdots. Twilight Sparkle is sure that when the dice is tossed, each face appears with probability
.
Also she knows that each toss is independent from others. Help her to calculate the expected maximum number of dots she could get after tossing the dice n times.
Input
A single line contains two integers m and n (1 ≤ m, n ≤ 105).
Output
Output a single real number corresponding to the expected maximum. The answer will be considered correct if its relative or absolute error doesn't exceed 10 - 4.
Sample Input
Input
Output
Input
Output
Input
Output
Hint
Consider the third test example. If you've made two tosses:
You can get 1 in the first toss, and 2 in the second. Maximum equals to 2.
You can get 1 in the first toss, and 1 in the second. Maximum equals to 1.
You can get 2 in the first toss, and 1 in the second. Maximum equals to 2.
You can get 2 in the first toss, and 2 in the second. Maximum equals to 2.
The probability of each outcome is 0.25, that is expectation equals to:
You can read about expectation using the following link: http://en.wikipedia.org/wiki/Expected_value
一开始以为用公式 ans = m - ((1/m)^n + (2/m)^n + (3/m)^n + ... + ((m-1)/m)^n)
会超时,因为以为pow时间复杂度为 O(n);
提交:
然后百度:
所以这个题就是这么做;
附上代码:
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main()
{
double n,m;
while(~scanf("%lf%lf",&m,&n)){
double s = 0;
if(n==1){
printf("%.5f\n",(1+m)*m/2/m);
}
else{
int len = m;
for(int i = 1;i<len;i++){
s+=pow(i/m,n);
}
printf("%.5f\n",m-s);
}
}
}
至于为什么这么做,下面是推的过程:
例如 6 3
1 - 1*1*1
2 - 2*2*2 - 1*1*1 -a
3 - 3*3*3 - 2*2*2 -b
4 - 4*4*4 - 3*3*3 -c
5 - 5*5*5 - 4*4*4 -d
6 - 6*6*6 - 5*5*5 -e
所以 ans = 6 * e + 5*d + 4 * c + 3*b + 2*a +1 = 6*6*6*6 - (1*1*1 + 2*2*2 -+ 3*3*3 + 4*4*4 + 5*5*5) = m - (...)(同上)--;
但是n=1的时候需要注意,因为这时候是不需要减得,所以加起来除以n就行。
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice CodeForces
453A
Description
Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she kept losing. Having returned to the castle, Twilight Sparkle became interested in the dice that were used in the game.
The dice has m faces: the first face of the dice contains a dot, the second one contains two dots, and so on, the m-th face
contains mdots. Twilight Sparkle is sure that when the dice is tossed, each face appears with probability
.
Also she knows that each toss is independent from others. Help her to calculate the expected maximum number of dots she could get after tossing the dice n times.
Input
A single line contains two integers m and n (1 ≤ m, n ≤ 105).
Output
Output a single real number corresponding to the expected maximum. The answer will be considered correct if its relative or absolute error doesn't exceed 10 - 4.
Sample Input
Input
6 1
Output
3.500000000000
Input
6 3
Output
4.958333333333
Input
2 2
Output
1.750000000000
Hint
Consider the third test example. If you've made two tosses:
You can get 1 in the first toss, and 2 in the second. Maximum equals to 2.
You can get 1 in the first toss, and 1 in the second. Maximum equals to 1.
You can get 2 in the first toss, and 1 in the second. Maximum equals to 2.
You can get 2 in the first toss, and 2 in the second. Maximum equals to 2.
The probability of each outcome is 0.25, that is expectation equals to:
You can read about expectation using the following link: http://en.wikipedia.org/wiki/Expected_value
一开始以为用公式 ans = m - ((1/m)^n + (2/m)^n + (3/m)^n + ... + ((m-1)/m)^n)
会超时,因为以为pow时间复杂度为 O(n);
提交:
然后百度:
所以这个题就是这么做;
附上代码:
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main()
{
double n,m;
while(~scanf("%lf%lf",&m,&n)){
double s = 0;
if(n==1){
printf("%.5f\n",(1+m)*m/2/m);
}
else{
int len = m;
for(int i = 1;i<len;i++){
s+=pow(i/m,n);
}
printf("%.5f\n",m-s);
}
}
}
至于为什么这么做,下面是推的过程:
例如 6 3
1 - 1*1*1
2 - 2*2*2 - 1*1*1 -a
3 - 3*3*3 - 2*2*2 -b
4 - 4*4*4 - 3*3*3 -c
5 - 5*5*5 - 4*4*4 -d
6 - 6*6*6 - 5*5*5 -e
所以 ans = 6 * e + 5*d + 4 * c + 3*b + 2*a +1 = 6*6*6*6 - (1*1*1 + 2*2*2 -+ 3*3*3 + 4*4*4 + 5*5*5) = m - (...)(同上)--;
但是n=1的时候需要注意,因为这时候是不需要减得,所以加起来除以n就行。
相关文章推荐
- C++递归实现全排列
- Openstack Liberty 发行纪要(有空再把keystone提炼一下)
- unity3d游戏物体跟着鼠标方向移动
- HP ALM 测试管理中心 创建发布树:
- Centos 7 学习加入用户
- 打印1到最大的n位数
- 实现函数 doubule Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题
- Thread安全与不安全
- Linux汇编语言及嵌入式汇编
- hive中Specified key was too long; max key length is 767 bytes问题解决
- HDU——2018 母牛的故事
- C和指针 (pointers on C)——第十四章:预处理器
- UVa1382--Distant Galaxy(离散化+扫描线)
- HP ALM 测试管理中心用户创建:
- 主线程与子线程之间相互通信
- 收集 天创恒达高清采集卡TC-5A0N7
- uft练习
- ieee浮点
- web工程中各类地址的写法
- linux目录解释