题目
输入一个整数 n ,求斐波那契数列的第 n 项。
假定从0开始,第0项为0。(n<=39)
样例
输入整数 n=5
返回 5

解法

yxc的总结
增加一条结论Sn = fn+2 - 1

  1. // 滚动变量
  2. class Solution {
  3. public:
  4. int Fibonacci(int n) {
  5. int a = 0, b = 1;
  6. while (n--) {
  7. b = a + b;
  8. a = b - a;
  9. }
  10. return a;
  11. }
  12. };
  13. // 快速矩阵幂

补充

斐波那契

必须得用快速矩阵幂

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. const int MOD = 1e4;
  5. void mul(int a[2], int f[2][2]) {
  6. int res[2];
  7. memset(res, 0, sizeof res);
  8. for (int i = 0; i < 2; i++)
  9. for (int j = 0; j < 2; j++) {
  10. res[i] = (res[i] + a[j] * f[j][i]) % MOD;
  11. }
  12. memcpy(a, res, sizeof res);
  13. }
  14. void mulself(int f[2][2]) {
  15. int res[2][2];
  16. memset(res, 0, sizeof res);
  17. for (int i = 0; i < 2; i++)
  18. for (int j = 0; j < 2; j++)
  19. for (int k = 0; k < 2; k++)
  20. res[i][j] = (res[i][j] + f[i][k] * f[k][j]) % MOD;
  21. memcpy(f, res, sizeof res);
  22. }
  23. void fi(int n) {
  24. int a[2] = {0, 1};
  25. int f[2][2] = {{0, 1}, {1, 1}};
  26. while (n) {
  27. if (n & 1) mul(a, f);
  28. mulself(f);
  29. n >>= 1;
  30. }
  31. printf("%d\n", a[0] % MOD);
  32. }
  33. int main() {
  34. int n;
  35. while (scanf("%d", &n), n != -1) {
  36. fi(n);
  37. }
  38. return 0;
  39. }