归纳递推数组 ,
代入初始值,求解状态矩阵 。
所以, 。
用快速幂将时间复杂度降到 。
import java.util.*; public class Main { public static final int mod = 1_000_000_007; public static long[][] multiply(long[][] matrix1, long[][] matrix2) { long[][] res = new long[matrix1.length][matrix1.length]; for (int i = 0; i < matrix1.length; i++) { for (int j = 0; j < matrix1.length; j++) { long sum = 0; for (int k = 0; k < matrix1.length; k++) sum = (sum + (matrix1[i][k] * matrix2[k][j]) % mod) % mod; res[i][j] = sum; } } return res; } public static long[][] powerN(long N, long[][] matrix) { long[][] res = new long[matrix.length][matrix.length]; for (int i = 0; i < res.length; i++) res[i][i] = 1; while (N != 0) { if ((N & 1) == 1) { res = multiply(res, matrix); } matrix = multiply(matrix, matrix); N = N >>> 1; } return res; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); long N = sc.nextLong(); sc.close(); if (N < 1) { System.out.println(0); return; } if (N == 1 || N == 2 || N == 3) { System.out.println(N); return; } long[][] matrix = {{1, 1, 0}, {0, 0, 1}, {1, 0, 0}}; long[][] res = powerN(N - 3, matrix); System.out.println((3 * res[0][0] + 2 * res[1][0] + res[2][0]) % mod); } }