题解 | #Little Pony and Expected Maximum#概率+线性容斥 超详细解析

Little Pony and Expected Maximum

https://ac.nowcoder.com/acm/contest/32282/C

牛客32282C-Little Pony and Expected Maximum

题意

  • 一个骰子有 mm 面,第 ii 个面有 ii 个点,每一面等概率出现,每次投掷的结果独立。
  • 计算投掷 nn 次骰子所能获得最大值的期望。

思路

  • 一个骰子有 m 面,投掷 n 次,仅前 i 面出现的概率为 (im)n(\frac{i}{m})^n
  • 所以答案 ans=1×(1m)n+2×(2m)n+...+n×(nm)nans=1\times(\frac{1}{m})^n+2\times(\frac{2}{m})^n+...+n\times(\frac{n}{m})^n

上面这句话对吗? 不对。 例如,(2m)n(\frac{2}{m})^n 的确是 仅前 2 面出现的概率,但是里面也包含了仅前 1 面出现的概率, 表达式中还将(2m)n(\frac{2}{m})^n乘了 2,显然不合适,要先减掉 (1m)n(\frac{1}{m})^n

再例如,(3m)n(\frac{3}{m})^n 的确是 仅前 3 面出现的概率,但是里面也包含了仅前 1 面出现的概率和仅前 2 面出现的概率, 表达式中还将(3m)n(\frac{3}{m})^n乘了 3,显然不合适,要先减掉 (1m)n(\frac{1}{m})^n(2m)n(\frac{2}{m})^n

代码

#include <cstdio>
#include <iostream>
#include <cmath>
const int N		= 1e6+10;
using namespace std;

int n, m;

void Solve()
{
	double ans = 0;
	double sum = 0;
	for (int i=1; i<=m; i++)
	{
		double tmp = pow(1.0*i/m,1.0*n);
		double p = tmp - sum;
		sum+=p;
		ans+=1.0*i*p;
	}
	printf("%.12lf\n",ans);
}

int main()
{
	scanf("%d %d",&m,&n);
	Solve();
	
	return 0;
}
全部评论
嘿嘿,氧气giegie~
点赞 回复 分享
发布于 2023-11-06 21:08 山东

相关推荐

神哥了不得:放平心态,再找找看吧,主要现在计算机也变卷了,然后就比较看学历了,之前高中毕业你技术强,都能找到工作的
点赞 评论 收藏
分享
2024-12-27 10:21
已编辑
海南师范大学 媒介策划
到我怀里来:身高体重住址这些就别写了,留几个关键的就行,工作经历突出重点写详细点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务