Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4090 | Accepted: 1050 |
Description
Input
Output
Sample Input
1 0.5 2 2 0.5 2 4
Sample Output
0.5000000 0.2500000
Source
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; double p; double num[2][2]; void fun(int x) { int i,j,k; double cnt[2][2]={p,1.0-p,1.0,0.0},tmp[2][2]; num[0][0]=num[1][1]=1.0; num[0][1]=num[1][0]=0.0; while(x>0) { if(x&1) { for(i=0;i<2;i++) for(j=0;j<2;j++) { tmp[i][j]=num[i][j]; num[i][j]=0.0; } for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) num[i][j]+=tmp[i][k]*cnt[k][j]; } for(i=0;i<2;i++) for(j=0;j<2;j++) { tmp[i][j]=cnt[i][j]; cnt[i][j]=0.0; } for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) cnt[i][j]+=tmp[i][k]*tmp[k][j]; x>>=1; } return ; } int main() { int N,i,cur,flag; int X[100]={-100}; double d[10]; double ans; while(scanf("%d%lf",&N,&p)==2) { for(i=1;i<=N;i++) scanf("%d",&X[i]); sort(X+1,X+1+N); if(X[1]==1) { printf("0.0000000\n"); continue; } flag=0; for(i=1;i<N;i++) if(X[i]+1==X[i+1]) { flag=1; printf("0.0000000\n"); break; } if(flag) continue; ans=1.0; cur=1; for(i=1;i<=N;i++) { d[1]=1.0; d[2]=p; if(X[i]-cur==1) { ans*=(1-d[2]); cur=X[i]+1; continue; } fun(X[i]-cur-1); d[3]=num[0][0]*d[2]+num[0][1]*d[1]; ans*=(1-d[3]); cur=X[i]+1; } printf("%.7lf\n",ans); } return 0; }