题意:
有一个无限长的路,路上布满地雷,初始在位置1,每次 p 的概率到下一格,(1- p)的概率到下二格
给出 p 以及地雷坐标a[i],问安全走过的概率是多少?
思路:
递推,用矩阵快速幂推,p[ a[i] +1 ] 推到 p[ a[i+1] -1 ] ,于是p[ a[i+1] +1 ] = p[ a[i+1] -1 ] *(1-p)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
int a[20];
struct node
{
double a[2][2];
} ;
node cheng(node xx,node yy)
{
node c;
memset(c.a,0.0,sizeof(c.a));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.a[i][j]+=(xx.a[i][k]*yy.a[k][j]);
return c;
}
int main()
{
int n,end,k;
double p;
double ans;
node x,y;
while(~scanf("%d%lf",&n,&p))
{
for(int i=1;i<=n;i++)
scanf("%d",a+i);
sort(a+1,a+1+n);
const node A={{p,1.0,1-p,0.0}};
x.a[0][0]=1.0;
x.a[0][1]=x.a[1][0]=x.a[1][1]=0.0;
a[0]=0;
k=1;
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1]) continue;
if(a[i]-a[i-1]==1)
{
x.a[0][0]=0.0;
break;
}
y=A;
k=(a[i]-1)-k;
while(k)
{
if(k&1) x=cheng(x,y);
y=cheng(y,y);
k>>=1;
}
k=a[i]+1;
x.a[0][0]=x.a[0][0]*(1.0-p);
x.a[0][1]=0.0;
}
ans=x.a[0][0];
printf("%.7f\n",ans);
}
return 0;
}
看见讨论区里