矩陣快速冪

2021-09-18 07:03:33 字數 1888 閱讀 7296

/*

f(n)=3*f(n-1)+2*f(n-2);

構造二維矩陣

一:求轉置矩陣

f(n) f(n-1) f(n-1) f(n-2) 3 1

= *

( ) ( ) ( ) ( ) 2 0

求初始矩陣

f(n) f(n-1) 3 1

f(n-1) f(n-2) 1 1

此形勢下 求值為 初始矩陣*轉置矩陣

轉置矩陣a 初始矩陣b

matrix a1,a2;

b1=qpow(a,n-2);

a1=multip(b,b1);注意這裡一定要和上面對應

二:求轉置矩陣

f(n) ( ) 3 2 f(n-1) ( )

= *

f(n-1) ( ) 1 0 f(n-2) ( )

求初始矩陣

f(n) f(n-1) 3 1

f(n-1) f(n-2) 1 1

此形勢下 求值為 轉置矩陣*初始矩陣

轉置矩陣a 初始矩陣b

matrix a1,a2;

b1=qpow(a,n-2);

a1=multip(b1,b);注意這裡一二區別

*/

/*

矩陣快速冪

*//*

*//*

f(n+1)=f(n)+2*f(n-1)+n^3+3*n^2+3*n+1

轉置矩陣

f(n+1) f(n) 1 2 1 3 3 1

f(n) f(n-1) 1 0 0 0 0 0

(n+1)^3 (n)^3 0 0 1 3 3 1

(n+1)^2 (n)^2 0 0 0 1 2 1

(n+1) (n) 0 0 0 0 1 1

1 1 0 0 0 0 0 1

*/#include #include #include #include #include #include #include #include #include #include //const long long mod=2147493647;

#define ll long long

using namespace std;

const long long n=6;

#define mod 123456789

struct matrix

void init()

return temp;

}int main()

else if(n==2)

else

;matrix a,b;

for(ll i=0;i}

a.a[0][0]=2;

a.a[1][0]=1;

//先是f(2)的值,然後是f(n)的值

a.a[2][0]=8;

a.a[3][0]=4;

a.a[4][0]=2;

a.a[5][0]=1;

//根據f(n+1)=f(n)+2*f(n-1)+n^3+3*n^2+3*n+1;將n=2代入

matrix p=qpow(b,n-2);

matrix ans=multip(p,a);

printf("%lld\n",ans.a[0][0]);}}

return 0;

}

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...