type matrix [2][2]int
func multiply(a, b matrix) (c matrix) {
for i := 0; i < 2; i++ {
for j := 0; j < 2; j++ {
c[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j]
}
}
return
}
func pow(a matrix, n int) matrix {
ret := matrix{{1, 0}, {0, 1}}
for ; n > 0; n >>= 1 {
if n&1 == 1 {
ret = multiply(ret, a)
}
a = multiply(a, a)
}
return ret
}
func fib(n int) int {
if n < 2 {
return n
}
res := pow(matrix{{1, 1}, {1, 0}}, n-1)
return res[0][0]
}
相关文章
- 跟我一起阅读Java源代码之HashMap(三)
- C++ 之 VS2010 和MySQL数据库的链接问题
- Golang | Leetcode Golang题解之第509题斐波那契数-题解:
- linux自学(一)之vmware虚拟机安装
- 【bzoj3687】【简单题】bitset
- 代码训练营 day49|LeetCode 1143,LeetCode 1035,LeetCode 53,LeetCode 392
- 《java入门第一季》之网络编程初探
- 机器学习之支持向量机(三):核函数和KKT条件的理解
- C/C++ 随机数生成方法
- (medium)LeetCode 241.Different Ways to Add Parentheses