/*
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...