codeforces #259 DIV2 C題 Little Pony and Expected Maximum(容斥+快速冪+公式推導),
題目地址: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;}
codeforces問題: codeforces比賽怎攻擊別人?
對某一題,首先你自己要先過TEST。然後回到比賽的PROBLEM列表,把這題後面的鎖鎖上(鎖上了就不能再提交了,所以沒把握就別鎖了),然後到ROOM裡面,你就可以看別人代碼了,下面有HACK按鈕,點一下,輸入你覺得他錯的範例。
codeforces上怎看測試資料
進入比賽,點MY SUBMISSIONS,然後再點#號下面的運行編號,就可以看到測試資料了