【我的AC代码】
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
double p;
int x[20];
struct Matrix{
double a[2][2];
};
Matrix operator *(const Matrix&a,const Matrix&b){
Matrix c;
for(int i=0; i<2; i++){
for(int j=0; j<2; j++){
c.a[i][j]=0;
for(int k=0; k<2; k++){
c.a[i][j]+=a.a[i][k]*b.a[k][j];
}
}
}
return c;
}
Matrix pow(Matrix a,int n){
Matrix res;
Matrix temp=a;
memset(res.a,0,sizeof(res.a));
for(int i=0; i<2; i++) res.a[i][i]=1;
while(n){
if(n&1) res=res*temp;
temp=temp*temp;
n>>=1;
}
return res;
}
int main(){
while(~scanf("%d%lf",&n,&p)){
for(int i=0; i<n; i++) scanf("%d",&x[i]);
sort(x,x+n);
double ans=1.0;
Matrix bas,now;
bas.a[0][0]=p,bas.a[0][1]=(1-p);
bas.a[1][0]=1,bas.a[1][1]=0;
now=pow(bas,x[0]-1);
ans*=(1-now.a[0][0]);
for(int i=1; i<n; i++){
if(x[i]==x[i-1]) continue;
now=pow(bas,x[i]-x[i-1]-1);
ans*=(1-now.a[0][0]);
}
printf("%.7f\n",ans);
}
return 0;
}