题目地址: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; }