2016-07-26 19 views
0

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?

+2

vermutlich, ähnlich wie Sie die * gesamte * [n. Fibonacci-Nummer in O (log n) Zeit] erhalten können (http://Stackoverflow.com/a/1525544/4892076) – jaggedSpire

+0

@jaggedSpire Ich denke, wir können wahrscheinlich dupe-tag das. – user4581301

+0

Die Anmerkungen zu diesen Fragen zeigen, dass die Antwort an einer bestimmten Ziffer falsch ist. – West

Antwort