【题意】
侦察兵YYF要通过一条布有地雷的路,他从1出发,每次有p的几率前进1格,1-p的几率前进两个,现已知所有地雷的位置,求YYF不踩中地雷的几率
【输入】
多组数据
每组数据第一行n、p
接下来一行n个数字表示地雷的位置
【输出】
YYF不踩中雷的几率
f[i]表示在没有地雷的情况下,走i距离的几率
可得f[i]=f[i-1]*p+f[i-2]*(1-p)
类似斐波那契的一个公式
构造一个矩阵
p 1
1-p 0
这个矩阵的i次方的(1,1)既是f[i]
然后按雷划分一下阶段即可
program poj3744; type square=array [1..2,1..2] of double; var n,i,j,k:longint; ans,p:double; mine:array [0..11] of longint; sol,root:square; procedure swap (var a,b:longint);inline; var i:longint; begin i:=a; a:=b; b:=i; end; procedure qsort (s,e:longint); var i,j,k:longint; begin if s>=e then exit; i:=s; j:=e; k:=mine[(s+e) div 2]; while i<=j do begin while mine[i]<k do inc(i); while mine[j]>k do dec(j); if i>j then break; swap(mine[i],mine[j]); inc(i); dec(j); end; qsort(s,j); qsort(i,e); end; function matrixmul (a,b:square):square; var ans:square; i,j,k:longint; begin fillchar(ans,sizeof(ans),0); for i:=1 to 2 do for j:=1 to 2 do for k:=1 to 2 do ans[i,j]:=ans[i,j]+a[i,k]*b[k,j]; exit(ans); end; function power (m:longint):square; var ans,now:square; begin ans[1,1]:=1; ans[1,2]:=0; ans[2,1]:=0; ans[2,2]:=1; now:=root; while m<>0 do begin if m and 1 = 1 then ans:=matrixmul(ans,now); m:=m div 2; now:=matrixmul(now,now); end; exit(ans); end; begin while not seekeof do begin read(n,p); for i:=1 to n do read(mine[i]); qsort(1,n); mine[0]:=0; root[1,1]:=p; root[1,2]:=1; root[2,1]:=1-p; root[2,2]:=0; ans:=1; for i:=1 to n do if mine[i-1]+1=mine[i] then begin ans:=0; break; end else begin sol:=power(mine[i]-(mine[i-1]+1)); ans:=ans*(1-sol[1,1]); end; writeln(abs(ans):0:7); end; end.