Ich habe eine Aufgabe in einem Online-Test mit wettbewerbsfähigen Programmier-Herausforderungen gesehen (kann leider nicht wo), die letzten (am wenigsten signifikanten) 6 Ziffern der N-ten Fibonacci-Nummer zu produzieren.Wie können wir das letzte erreichen, z.B. 6 Ziffern der N-ten Fibonacci-Nummer in O (logN) Zeit?
Ich habe es geschafft mit der folgenden Lösung zu kommen:
#include <iostream>
#include <cassert>
#include <tuple>
int solution(int N)
{
if(N == 0) return 0;
if(N == 1) return 1;
if(N == 2) return 1;
int a = 0;
int b = 1;
int c = 1;
for (int i = 3; i <= N; ++i) {
std::tie(a, b, c) = std::make_tuple(b, (a + b) % 1000000, (b + c) % 1000000);
}
return c;
}
int main()
{
assert(solution(8) == 21);
assert(solution(36) == 930352);
std::cout << solution(10000000) << std::endl;
}
die leider O(N)
Zeitkomplexität hat und starten ziemlich langsam für Eingaben wie in der letzten Zeile auszuführen: N> 10000000.
Weiß jemand, wie dies in O(logN)
erreicht werden kann?
vermutlich, ähnlich wie Sie die * gesamte * [n. Fibonacci-Nummer in O (log n) Zeit] erhalten können (http://Stackoverflow.com/a/1525544/4892076) – jaggedSpire
@jaggedSpire Ich denke, wir können wahrscheinlich dupe-tag das. – user4581301
Die Anmerkungen zu diesen Fragen zeigen, dass die Antwort an einer bestimmten Ziffer falsch ist. – West