我们怎样才能达到最后O(logN)时间内Nth Fibonacci数的6位数?

时间:2016-07-26 20:33:38

标签: c++ algorithm math time-complexity fibonacci

我已经看到了一项关于竞争性编程挑战的在线测试的任务(不能在不幸的地方披露),以产生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)中实现这一目标?

1 个答案:

答案 0 :(得分:2)

有一种算法采用O(log_n)时间来使用Q-Matrix计算第n个斐波纳契数。您可以查看http://kukuruku.co/hub/algorithms/the-nth-fibonacci-number-in-olog-n,您需要做的唯一更改是确保它只生成最后6位数。