(здесь новичок)
Я хочу знать, как найти n-й номер последовательности F [n] = F [n-1] + F [n-2].
Ввод:
F[0] = a;
F[1] = b;
a,b < 101
N < 1000000001
M < 8; M=10^M;
a и b - начальные порядковые номера.
n - это n-й номер последовательности, которую мне нужно найти.
M по модулю, число быстро становится очень большим, поэтому F [n] = F [n]% 10 ^ M, мы находим остаток, потому что нужны только последние цифры n-го числа
Рекурсивный подход слишком медленный:
int fib(int n)
{
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
Решение динамического программирования, которое занимает время O (n), также слишком медленное:
f[i] = f[i-1] + f[i-2];
Хотя есть решения о том, как найти n-й номер быстрее, если первые числа последовательности равны 0 и 1 (n-й номер можно найти в O (log n)), используя следующую формулу:
If n is even then k = n/2:
F(n) = [2*F(k-1) + F(k)]*F(k)
If n is odd then k = (n + 1)/2
F(n) = F(k)*F(k) + F(k-1)*F(k-1)
(ссылка на формулу и реализацию кодас этим: https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/)
Но эта формула не работает, если начальные числа что-то вроде 25 и 60. И рекурсивный подход слишком медленный.
Поэтому я хочу знать, как я могунайдите n-й номер последовательности быстрее, чем O (n). Неполный код будет полезен.
Спасибо.