跳臺階問題|斐波那契遞迴的複雜度問題|整數劃分問題
阿新 • • 發佈:2019-01-29
struct matrix_2by2 { matrix_2by2(long long a_00 = 0, long long a_01 = 0, long long a_10 = 0, long long a_11 = 0) :a00(a_00),a01(a_01),a10(a_10),a11(a_11)//為書寫方便,給struct一個建構函式 { } long long a00; long long a01; long long a10; long long a11; }; typedef struct matrix_2by2 matrix_2by2; matrix_2by2 matrix_2by2_multiple(const matrix_2by2 A, const matrix_2by2 B) { return matrix_2by2 ( A.a00*B.a00 + A.a01*B.a10, A.a00*B.a01 + A.a01*B.a11, A.a10*B.a00 + A.a11*B.a10, A.a10*B.a01 + A.a11*B.a11 ); } matrix_2by2 matrix_pow(int N) { assert(N > 0); matrix_2by2 matrix; if (N == 1) { return matrix_2by2(1, 1, 1, 0); } if (N % 2 == 0) matrix = matrix_2by2_multiple(matrix_pow(N/2), matrix_pow(N/2)); if (N % 2 == 1) { matrix = matrix_2by2_multiple(matrix_pow((N-1)/2), matrix_pow((N-1)/2)); matrix = matrix_2by2_multiple(matrix, matrix_2by2(1,1,1,0)); } return matrix; } long long matrix_fabonacci(int N) { if(N <=2) return N; matrix_2by2 res = matrix_pow(N); return res.a00; }