1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std;
typedef long long ll;
const int maxn = 207; const int mod = 1000000007; const int Mod = 1000; struct mat{ int r,c; double m[10][10]; mat(){} mat(int _r,int _c):r(_r),c(_c){}; };
void init(mat &a){ memset(a.m,0,sizeof(a.m)); }
mat mul(mat a, mat b){ mat tmp(a.r,b.c);
for (int i = 1 ; i <= tmp.r; i ++) { for (int j = 1 ; j <= tmp.c ;j ++){ tmp.m[i][j] = 0; for (int k =1 ; k <= a.c ; k ++){ tmp.m[i][j] = (tmp.m[i][j]+(a.m[i][k]*b.m[k][j])); } } } return tmp; }
mat QP(mat a ,int n){ mat ans(a.r,a.r),tmp(a.r,a.r); memcpy(tmp.m,a.m,sizeof(tmp.m)); init(ans); for (int i = 1 ; i <= ans.r ; i ++) { ans.m[i][i] = 1; } while (n){ if (n&1) ans = mul(ans,tmp); n >>= 1; tmp = mul(tmp,tmp); } return ans; }
void print(mat a){ for (int i = 1 ; i <= a.r ;++ i){ for (int j = 1 ; j <= a.c ; ++j){ printf("%f",a.m[i][j]); if (j==a.c) putchar('\n'); else putchar(' '); } } }
int n; double p; int arr[maxn]; double dp[100000009];
int main() { while (~scanf("%d%lf",&n,&p)) { mat a(2,2); a.m[1][1] = p; a.m[1][2] = 1; a.m[2][1] = 1-p; a.m[2][2] = 0; for (int i =1 ; i <= n ; i ++) scanf("%d",&arr[i]); sort(arr+1,arr+n+1); if (arr[1] == 1) printf("%.7f\n",0); else { double t = 1; mat ans = QP(a,arr[1]-1); t *= (1-ans.m[1][1]); int f = 1; for (int i = 2 ; i <= n ; i ++) {
if (arr[i]==arr[i-1]) continue; if (arr[i]-arr[i-1]==1) { f = 0; printf("%.7f\n",0); break; } ans = QP(a,arr[i]-arr[i-1]-1); t *= (1-ans.m[1][1]); } if (f) printf("%.7f\n",t); }
} return 0; }
|