Skip to content

Commit 5281d6e

Browse files
committed
简化代码
1 parent ef539d1 commit 5281d6e

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

copypasta/math_matrix.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,8 @@ func calcFibonacci(p, q, a1, a2, n int) int {
177177
if n == 1 {
178178
return a1 % mod
179179
}
180-
if n == 2 {
181-
return a2 % mod
182-
}
183-
// 用打家劫舍的状态机写法理解,其中 f[i][0] 表示 i 可选可不选,f[i][1] 表示 i 一定不能选
180+
// 变形得到 [f[n], f[n-1]] = [[p, q], [1, 0]] = [f[n-1], f[n-2]]
181+
// 也可以用打家劫舍的状态机写法理解,其中 f[i][0] 表示 i 可选可不选,f[i][1] 表示 i 一定不能选
184182
// f[i][0] += p*f[i-1][0] 不选 i
185183
// f[i][0] += q*f[i-1][1] 选 i,那么 i-1 一定不能选
186184
// f[i][1] = f[i-1][0]
@@ -189,13 +187,13 @@ func calcFibonacci(p, q, a1, a2, n int) int {
189187
{p, q},
190188
{1, 0},
191189
}
192-
// f0 怎么写可以代入 n=3 算一算
193-
f0 := matrix{
190+
f2 := matrix{
194191
{a2},
195192
{a1},
196193
}
197-
// 结果是个列向量 [f[n-2][0] f[n-2][1]],取 f[n-2][0]
198-
return m.powMul(n-2, f0)[0][0]
194+
// 结果是列向量 [f[n], f[n-1]],取第一项
195+
fn := m.powMul(n-2, f2)
196+
return fn[0][0]
199197
}
200198

201199
func newIdentityMatrix(n int) matrix {

0 commit comments

Comments
 (0)