Codeforces Round #259 (Div. 1)A(公式)

传送门

题意

给出m个面的骰子扔n次,取最大值,求期望

分析

暴力算会有重复,而且复杂度不对。
考虑m个面扔n次得到m的概率,发现只要减去(m-1)个面扔n次得到m-1的概率即可,给出example说明

n=2 m=6
6 6 6 6 6 6
5 5 5 5 5 6
4 4 4 4 5 6
3 3 3 4 5 6
2 2 3 4 5 6
1 2 3 4 5 6

得到公式

[sum_{i=1}^m{i*(i^n-(i-1)^n)/m^n} ]

代码

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
#pragma comment(linker, "/STACK:102400000,102400000")
inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}

//Σ{i_1}^m{i^n-(i-1)^n}/{m^n}
int n,m;
long double ans;
long double ex_mod(long double x,int p)
{
    long double ret=1;
    for(long double tmp=x;p;p>>=1,tmp*=tmp) if(p&1) { ret*=tmp; }
    return ret;
}
int main()
{
    scanf("%d %d",&m,&n);
    F(i,1,m)
    {
        ans+=i*(ex_mod((ld)i/(ld)m,n)-ex_mod((ld)(i-1)/(ld)m,n));
    }
    printf("%Lf
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/chendl111/p/6571113.html