标签:
1 /* 2 POJ 3744 3 4 C++ 0ms 184K 5 */ 6 #include<stdio.h> 7 #include<string.h> 8 #include<algorithm> 9 #include<iostream> 10 #include<math.h> 11 using namespace std; 12 13 struct Matrix 14 { 15 double mat[2][2]; 16 }; 17 Matrix mul(Matrix a,Matrix b) 18 { 19 Matrix ret; 20 for(int i=0;i<2;i++) 21 for(int j=0;j<2;j++) 22 { 23 ret.mat[i][j]=0; 24 for(int k=0;k<2;k++) 25 ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; 26 } 27 return ret; 28 } 29 Matrix pow_M(Matrix a,int n) 30 { 31 Matrix ret; 32 memset(ret.mat,0,sizeof(ret.mat)); 33 for(int i=0;i<2;i++)ret.mat[i][i]=1; 34 Matrix temp=a; 35 while(n) 36 { 37 if(n&1)ret=mul(ret,temp); 38 temp=mul(temp,temp); 39 n>>=1; 40 } 41 return ret; 42 } 43 44 int x[30]; 45 int main() 46 { 47 int n; 48 double p; 49 while(scanf("%d%lf",&n,&p)!=EOF)//POJ上G++要改为cin输入 50 { 51 for(int i=0;i<n;i++) 52 scanf("%d",&x[i]); 53 sort(x,x+n); 54 double ans=1; 55 Matrix tt; 56 tt.mat[0][0]=p; 57 tt.mat[0][1]=1-p; 58 tt.mat[1][0]=1; 59 tt.mat[1][1]=0; 60 Matrix temp; 61 62 temp=pow_M(tt,x[0]-1); 63 ans*=(1-temp.mat[0][0]); 64 65 for(int i=1;i<n;i++) 66 { 67 if(x[i]==x[i-1])continue; 68 temp=pow_M(tt,x[i]-x[i-1]-1); 69 ans*=(1-temp.mat[0][0]); 70 } 71 printf("%.7lf\n",ans);//POJ上G++要改为%.7f 72 } 73 return 0; 74 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4400949.html