InputThere are several test cases.
For each test case, there is a single line containing an integer n (1 ≤ n ≤ 2 × 10 5) and a real number p (0 ≤ p ≤ 1, with 6 digits after the decimal).
Input is terminated by EOF.OutputFor each test case, output one line 「Case X: Y」 where X is the test case number (starting from 1) and Y is a real number indicating the desired answer.
Any answer with an absolute error less than or equal to 10 -4 would be accepted.Sample Inputios
10 0.400000 100 0.500000 124 0.432650 325 0.325100 532 0.487520 2276 0.720000
Sample Outputgit
Case 1: 3.528175 Case 2: 10.326044 Case 3: 28.861945 Case 4: 167.965476 Case 5: 32.601816 Case 6: 1390.500000
求指望,用log來提升精度而且實現組合數。
#include<iostream> #include<cstdlib> #include<stdio.h> #include<math.h> #define ll __int64 using namespace std; #define N 1000005 double a[N<<1]; int main() { a[0]=0; for(int i=1;i<N*2;i++) a[i]=a[i-1]+log(1.0*i); int n; double p; int t=0; while(~scanf("%d%lf",&n,&p)) { double ans=0,res1,res2; for(int i=0;i<=n;i++) { res1=(a[2*n-i]-a[n]-a[n-i])+(n+1)*log(p)+(n-i)*log(1-p); res2=(a[2*n-i]-a[n]-a[n-i])+log(1-p)*(n+1)+log(p)*(n-i); ans+=exp(res1)*i+exp(res2)*i; } printf("Case %d: %.6f\n",++t,ans); } }