首页 > 试题广场 >

斐波那契数列

[编程题]斐波那契数列
  • 热度指数:3690 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}斐波那契数列(Fibonacci Sequence)定义如下:
\hspace{23pt}\bullet\, F_1 = F_2 = 1
\hspace{23pt}\bullet\, 对于 i \geqq 3,有 F_i = F_{i-1} + F_{i-2}

\hspace{15pt}给定一个正整数 k,请你输出 F_k 的值。由于这个结果可能很大,你只需要输出这个结果对 (10^9+7) 取模后的结果即可。

输入描述:
\hspace{15pt}在一行上输入一个整数 k\left(1\leqq k\leqq 10^6\right)


输出描述:
\hspace{15pt}输出一个整数,表示 F_k \bmod (10^9+7) 的值。
示例1

输入

19

输出

4181

矩阵乘法解决,保证时间复杂度为O(logN)

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        int n = k - 2;
        if (n <= 2) {
            System.out.println(1);
            return;
        }

        int[][] matrix = new int[][]{{1, 1}, {1, 0}};
        matrix = matrixPower(matrix, n);
        int result = matrix[0][0] + matrix[1][0];
        System.out.println(result);
    }

    private static int[][] matrixPower(int[][] m, int n) {

        int[][] result = new int[m.length][m[0].length];
        for (int i = 0; i < m.length; i++) {
                result[i][i] = 1;
        }

        while (n != 0) {
            result = (n & 1) == 1 ? matrixMultiply(result, m) : result;
            m = matrixMultiply(m, m);
            n >>= 1;
        }

        return result;
    }

    private static int[][] matrixMultiply(int[][] a, int[][] b) {
        if (a[0].length != b.length)
            return null;

        int[][] result = new int[a.length][b[0].length];
        for (int row = 0; row < a.length; row++) {
            for (int column = 0; column < b[0].length; column++) {
                int temp = 0;
                for (int i = 0; i < a[row].length; i++) {
                    temp += a[row][i] * b[i][column];
                }
                result[row][column] = temp;
            }
        }

        return result;
    }
}
发表于 2019-04-24 15:27:35 回复(0)

问题信息

上传者:小小
难度:
1条回答 5977浏览

热门推荐

通过挑战的用户

查看代码
斐波那契数列