1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("*****\n"); 15 const int MAXN=1005; 16 int n,m,tt,x[MAXN],dp[MAXN]; 17 struct Matrix 18 { 19 double mat[2][2]; 20 }; 21 Matrix mul(Matrix a,Matrix b) 22 { 23 Matrix ret; 24 for(int i=0;i<2;i++) 25 for(int j=0;j<2;j++) 26 { 27 ret.mat[i][j]=0; 28 for(int k=0;k<2;k++) 29 ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; 30 } 31 return ret; 32 } 33 Matrix pow_M(Matrix a,int n) 34 { 35 Matrix ret; 36 memset(ret.mat,0,sizeof(ret.mat)); 37 for(int i=0;i<2;i++)ret.mat[i][i]=1; 38 Matrix temp=a; 39 while(n) 40 { 41 if(n&1)ret=mul(ret,temp); 42 temp=mul(temp,temp); 43 n>>=1; 44 } 45 return ret; 46 } 47 int main() 48 { 49 int i,j,k; 50 #ifndef ONLINE_JUDGE 51 freopen("1.in","r",stdin); 52 #endif 53 double p; 54 while(scanf("%d%lf",&n,&p)!=EOF) 55 { 56 double ans=1; 57 for(i=0;i<n;i++) scanf("%d",x+i); 58 sort(x,x+n); 59 Matrix a,b; 60 a.mat[0][0]=p; 61 a.mat[0][1]=1-p; 62 a.mat[1][0]=1; 63 a.mat[1][1]=0; 64 b=pow_M(a,x[0]-1); 65 ans*=(1-b.mat[0][0]); 66 for(i=1;i<n;i++) 67 { 68 if(x[i]==x[i-1]) continue; 69 b=pow_M(a,x[i]-x[i-1]-1); 70 ans*=(1-b.mat[0][0]); 71 } 72 printf("%.7f\n",ans); 73 } 74 }