YYF 都会以p的概率走一步,或者以 1- p的概率跳两步,所以状态转移方程跟容易就能推出来
dp[i]=p * dp[i-1] + (1-p) * dp[i-2]
但是因为地雷的位置在1~100000000范围内
所以需要用到矩阵快速幂加速运算过程
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct matrix
{
double m[3][3];
};
matrix multiply(matrix x,matrix y)
{
matrix z;
memset(z.m,0,sizeof z.m);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
z.m[i][j]+=x.m[i][k]*y.m[k][j];
return z;
}
double fast_power(matrix A,int n)
{
matrix B;
B.m[0][0]=B.m[1][1]=1;
B.m[0][1]=B.m[1][0]=0;
while(n)
{
if(n&1) B=multiply(A,B);
A=multiply(A,A);
n>>=1;
}
return B.m[0][0];
}
int mines[15];
int main()
{
int n;double p;
while(scanf("%d %lf",&n,&p)!=EOF)
{
memset(mines,0,sizeof mines);
for(int i=1;i<=n;i++) scanf("%d",&mines[i]);
sort(mines+1,mines+n+1);
matrix A;
A.m[0][0]=p;A.m[1][0]=1-p;
A.m[0][1]=1;A.m[1][1]=0;
double ans=1;
for(int i=1;i<=n;i++)
{
if(mines[i]==mines[i-1]) continue;
ans=ans*(1-fast_power(A,mines[i]-mines[i-1]-1));
}
printf("%.7f\n",ans);
}
return 0;
}