//poj 3744 Scout YYF I(概率dp+矩阵快速幂)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100;
int md[N];//地雷的位置
double p;//概率
int n;//地雷的个数
double ans;
struct Ma
{
double m[2][2];
}temp1;
Ma operator*(Ma a,Ma b){
Ma c;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
c.m[i][j]=0;
for(int k=0;k<2;k++)
c.m[i][j]+=a.m[i][k]*b.m[k][j];
}
return c;
}
void init()
{
temp1.m[0][0]=p;temp1.m[0][1]=1-p;
temp1.m[1][0]=1;temp1.m[1][1]=0;
}
double powMa(Ma a,int n)
{
Ma b;
b.m[0][0]=1; b.m[0][1]=0;
b.m[1][0]=0; b.m[1][1]=1;
while(n){
if(n&1){
b=a*b;
}
a=a*a;
n>>=1;
}
return b.m[0][0];
}
double Bpr(int dis)
{
return powMa(temp1,dis);
}
int main()
{
int n;
int i;
while(cin>>n>>p)
{
init();
for(i=0;i<n;i++)
{
cin>>md[i];
}
sort(md,md+n);
ans=1-Bpr(md[0]-1);
for(i=1;i<n;i++)
{
ans*=(1-Bpr(md[i]-md[i-1]-1));
}
printf("%0.7lf\n",ans);
}
return 0;
}
poj 3744 Scout YYF I(概率dp+矩阵快速幂)
最新推荐文章于 2021-07-29 11:16:49 发布