O problema 1531 do Uri Online Judge pede para calcular Fib(Fib(10^9))
módulo M
. As estratégias Top-Down e Bottom-Down não funcionam para este caso. No editorial abaixo você aprenderá: Sequência de Pisano, Fast Doubling e Exponenciação de Matriz
- http://crbonilha.com/2014/03/05/contest-delta-editorial-pt2/#more-97
- https://chunminchang.github.io/blog/post/calculating-fibonacci-numbers-by-fast-doubling
Os links abaixo lista métodos para calcular o n-ésimo número da sequência de Fibonacci de formas mais rápidas. Passe o olho por todos, pois cada um tem uma forma diferentes de apresentar os métodos.
- https://www.nayuki.io/page/fast-fibonacci-algorithms
- http://marathoncode.blogspot.com/2012/09/relacao-de-recorrencia-com.html
- https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
O número de Pisano é o número de termos no qual a sequência de Fibonacci módulo m
leva para voltar a se repetir. Em outras palavras, sabendo que a sequência de Fibonacci módulo m
é periódica, o número de Pisano é o tamanho do período. Uma fórma de calcular o número de Pisano para determinado m
é:
long long get_pisano_period(long long m) {
long long a = 0, b = 1, c = a + b;
for (int i = 0; i < m * m; i++) {
c = (a + b) % m;
a = b;
b = c;
if (a == 0 && b == 1) return i + 1;
}
}
Dessa forma, utilizando o número de Pisano, é possível calcular Fibonacci módulo m
de um número n
muito grande:
long long get_fibonacci_huge(long long n, long long m) {
long long remainder = n % get_pisano_period(m);
long long first = 0;
long long second = 1;
long long res = remainder;
for (int i = 1; i < remainder; i++) {
res = (first + second) % m;
first = second;
second = res;
}
return res % m;
}
Um paralelo muito importante com o problema de maior subsequência cresente e o maior caminho em um grafo é explicado neste post:
Entender essa analogia pode trazer benefícios da teoria dos grafos para resolução de problemas envolvendo maior subsequência crescente.
- https://www.youtube.com/watch?v=s_LfN4ItCs4
- https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-spring-2015/counting/tp9-1/
- https://neps.academy/lesson/229
- https://neps.academy/lesson/230
- https://www.urionlinejudge.com.br/judge/pt/tournaments/rank/4186
- Senha: agor@va1