YYF 沿數軸移動,某些位置有「陷阱」。從 0 出發,每步 +1 或 +2(概率 p, 1-p)。求到達終點不踩陷阱的概率。
等價於:在無陷阱區間長度 L 內,從左端點走到右端點的概率。
設 f[i] = 從位置 i 走到區間右端點的概率。
f[i] = p·f[i+1] + (1−p)·f[i+2]。
邊界:f[R] = 1, f[R+1] = 0。
這是線性遞推,可用 2×2 矩陣快速冪加速。
轉移矩陣:
[ f[i] ] = [ p 1−p ] [ f[i+1] ]
[ f[i+1] ] [ 1 0 ] [ f[i+2] ]
struct Mat { double a[2][2]; };
Mat mul(Mat A, Mat B) {
Mat C; memset(C.a, 0, sizeof(C.a));
for (int i=0;i<2;++i) for (int k=0;k<2;++k) for (int j=0;j<2;++j)
C.a[i][j] += A.a[i][k] * B.a[k][j];
return C;
}
Mat mpow(Mat base, long long exp) {
Mat res; memset(res.a, 0, sizeof(res.a));
res.a[0][0]=res.a[1][1]=1;
while (exp) {
if (exp&1) res = mul(res, base);
base = mul(base, base);
exp >>= 1;
}
return res;
}
double calc_interval(long long len, double p) {
if (len <= 0) return 1;
Mat trans = {{{p, 1-p}, {1, 0}}};
Mat m = mpow(trans, len);
return m.a[0][0]; // f[0] = m[0][0]*1 + m[0][1]*0
}
O(K log L),K 為陷阱數,L 為區間長度,極快。