题目地址:http://codeforces.com/contest/454/problem/C
这题根据容斥原理可以推出公式:
期望P=((m^n-(m-1)^n)*m+((m-1)^n-(m-2)^n)*(m-1)+.......+(1^n-0^n)*1)/m^n;
这个公式还是挺容易推出来的。。从1到m的n次方可以用快速幂求出来。但是一个问题是数太大了,100000^10^5是一个有500W位的数字。。即使转换成double也存不下。那这时候应该怎么办呢。可以对公式进行化简。都对除数约分。
公式就成了:
期望P=((m/m)^n-((m-1)/m)^n)*m+(((m-1)/m)^n-((m-2)/m)^n)*(m-1)+....+((1/m)^n-(0/m)^n)*1).
这样的话大数据就不存在了。然后用快速幂求幂。时间复杂度m^lgn,已经足够了。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>
using namespace std;
double a[110000];
double quickpow(double m,int n)
{
double b = 1;
while (n > 0)
{
if (n & 1)
b = b*m;
n = n >> 1 ;
m = m*m;
}
return b;
}
int main()
{
int n, m, i;
double s=0, t;
double ans;
scanf("%d%d",&m,&n);
a[0]=0;
for(i=1;i<=m;i++)
{
a[i]=quickpow(i*1.0/m,n);
//printf("%d ",a[i]);
}
for(i=m;i>=1;i--)
{
s+=(a[i]-a[i-1])*i;
}
//printf("%I64d\n",s);
printf("%.12lf\n",s);
return 0;
}