题目链接:
题意:在X坐标轴上有一些位置是陷阱。 一个人开始在1,每次向前跳一步的概率p,跳两步的概率1-p。求安全通过所有陷阱的概率。
思路:对于两个陷阱之间的设长度为L,其实就是就是从1跳到L的概率,f[0]=0,f[1]=1,f[n]=f[n-2]*(1-p)+f[n-1]*p。
class Matrix{public: double a[2][2]; Matrix() { clr(a,0); } Matrix(double x,double y,double z,double w) { a[0][0]=x; a[0][1]=y; a[1][0]=z; a[1][1]=w; } Matrix operator*(Matrix b) { Matrix ans; int i,j,k; FOR0(k,2) FOR0(i,2) FOR0(j,2) { ans.a[i][j]+=a[i][k]*b.a[k][j]; } return ans; }};Matrix a,b;int n,c[15];double p;double get(int x){ if(x==0) return 0; x--; a=Matrix(0,1-p,1,p); b=Matrix(1,0,0,1); while(x) { if(x&1) b=b*a; a=a*a; x>>=1; } return b.a[1][1];}int main(){ Rush(n) { RD(p); int i; FOR1(i,n) RD(c[i]); sort(c+1,c+n+1); n=unique(c+1,c+n+1)-(c+1); double ans=1; i=1; while(i<=n) { ans*=get(c[i]-c[i-1]-1); ans*=(1-p); i++; } PR(ans); } return 0;}