Хитрость в том, чтобы заметить, что вы можете вычислить числа Фибоначчи с помощью умножения матриц:
| 0 1 | | a | | b |
| 1 1 | * | b | = | a + b |
С этим знанием мы можем вычислить n-е число Фибоначчи:
| 0 1 |^n | 0 |
| 1 1 | * | 1 |
Поскольку матричное умножение ассоциативно, мы можем эффективно вычислить m ^ n.
- Если
n
четное, m^n = m^(n/2) * m^(n/2)
- Если
n
нечетное, m^n = m^((n-1)/2)) * m^((n-1)/2)) * m
Обратите внимание, что нам нужно одно и то же дважды, но мы должны вычислить его только один раз.
Это позволяет вычислить n-е число Фибоначчи в O(log n)
.
Я оставляю вам право писать код.