题解 | 斐波那契数列

斐波那契数列

https://www.nowcoder.com/practice/c245af6cfdce49ceb5435f649ee14f89

方法一:循环枚举(也可理解为滚动数组(变量)优化DP),时间复杂度O(k),空间复杂度O(1)

#include <iostream>

constexpr int P = 1E9 + 7;

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int k;
  std::cin >> k;

  if(k < 3){
    std::cout << "1\n";
    return 0;
  }

  int cur = 1, prev = 1;
  for(int i = 3; i <= k; i++){
    int tmp = (cur + prev) % P;
    prev = cur;
    cur = tmp;
  }

  std::cout << cur << "\n";

  return 0;
}

方法二:记忆化dfs,时间复杂度O(k),空间复杂度O(k)

#include <iostream>
#include <vector>
#include <functional>

constexpr int P = 1E9 + 7;

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int k;
  std::cin >> k;
  
  std::vector<int> f(k + 1);
  std::function<int(int)> dfs = [&](int n){
    if(n == 1 || n == 2){
      return 1;
    }
    if(f[n]){
      return f[n];
    }

    return f[n] = (dfs(n - 1) + dfs(n - 2)) % P;
  };

  std::cout << dfs(k) << "\n";

  return 0;
}

方法三:矩阵快速幂,时间复杂度O(logk),空间复杂度O(1)

#include <iostream>
#include <vector>

using Matrix = std::vector<std::vector<int>>;

constexpr int P = 1E9 + 7;

Matrix mul(const Matrix& A, const Matrix& B){
  Matrix res(A.size(), std::vector<int>(B[0].size()));
  for(int i = 0; i < A.size(); i++){
    for(int j = 0; j < A[0].size(); j++){
      for(int k = 0; k < B[0].size(); k++){
        res[i][k] = (res[i][k] + (1LL * A[i][j] * B[j][k] % P)) % P;
      }
    }
  }
  return res;
}

Matrix power(Matrix A, int b){
  Matrix res(A.size(), std::vector<int>(A[0].size()));
  for(int i = 0; i < res.size(); i++){
    res[i][i] = 1;
  }
  for(; b; A = mul(A, A), b >>= 1){
    if(b & 1){
      res = mul(res, A);
    }
  }
  return res;
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int k;
  std::cin >> k;

  if(k < 3){
    std::cout << "1\n";
    return 0;
  }

  Matrix A(1, std::vector<int>(2));
  A = {{1, 1}};

  Matrix B(2, std::vector<int>(2));
  B = {
    {0, 1},
    {1, 1}
  };

  auto Bk_1 = power(B, k - 1);
  auto ans = mul(A, Bk_1);

  std::cout << ans[0][0] << "\n";

  return 0;
}

全部评论

相关推荐

牛客96931767...:这履历不是在网安横着走啊
大家都开始春招面试了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务