题目大意: 有一个 n n n 面的骰子,投 m m m 次,问投出的最大值的期望是多少。
题解
枚举一个 i i i 作为最大值,然后将所有 i i i 的贡献加起来即可。
假如 i i i 是最大值,那么投 m m m 次要满足至少投出一个 i i i,以及不能投出大于 i i i 的数。情况数有 i m − ( i − 1 ) m i^m-(i-1)^m im−(i−1)m 种,即在前 i i i 个里面随便选 m m m 个的方案数,减去不合法的,也就是一个 i i i 都投不出的方案数,然后乘以 i i i,因为求的是期望,即概率乘权值。
最后除以总方案数
n
m
n^m
nm 即可,但是如果分子分母分开算会存不下,所以柿子要弄成这样:
∑
i
=
1
n
i
m
−
(
i
−
1
)
m
n
m
×
i
=
i
×
(
i
m
)
n
−
i
×
(
i
−
1
n
)
m
\sum_{i=1}^n \frac {i^m-(i-1)^m} {n^m}\times i=i\times (\frac i m)^n-i\times (\frac {i-1} n)^m
i=1∑nnmim−(i−1)m×i=i×(mi)n−i×(ni−1)m
代码甚至还可以优化一下,感性理解就好,或者你写成上面柿子的样子也可以的:
#include <cstdio>
int n,m;
double ans;
double ksm(double x,int y)
{
double re=1.0;
while(y)
{
if(y&1)re*=x;
x*=x;y>>=1;
}
return re;
}
int main()
{
scanf("%d %d",&n,&m);ans=n;
for(int i=1;i<n;i++)ans-=ksm(1.0*i/n,m);
printf("%.10lf",ans);
}