我已经看到了一项关于竞争性编程挑战的在线测试的任务(不能在不幸的地方披露),以产生Nth Fibonacci数的最后(最不重要)6位数。
我设法提出以下解决方案:
#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;
}
不幸的是,时间复杂度O(N)
并且对于像最后一行那样的输入开始运行非常缓慢:N&gt;千万。
任何人都知道如何在O(logN)
中实现这一目标?
答案 0 :(得分:2)
有一种算法采用O(log_n)时间来使用Q-Matrix计算第n个斐波纳契数。您可以查看http://kukuruku.co/hub/algorithms/the-nth-fibonacci-number-in-olog-n,您需要做的唯一更改是确保它只生成最后6位数。