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\n",ans);
return 0;
}
一直地一直地往前走