矩陣快速冪

2022-03-20 15:12:57 字數 2481 閱讀 9649

降低時間複雜度,使用盡量少的相乘次數。

例如:q^w化為(q*q)^(w/2) 。注意:當w為奇數的時候,我們要把(q*q)^(w/2)乘以q,理由是符號「/」是整除。

所以在快速冪中乘積的底數是q*q,不是q了。

給定乙個n階矩陣a,輸出a的m次冪(m是非負整數)

例如:

a =

1 2

3 4

a的2次冪

7 10

15 22

第一行是乙個正整數n、m(1<=n<=30, 0<=m<=5),表示矩陣a的階數和要求的冪數。

接下來n行,每行n個絕對值不超過10的非負整數,描述矩陣a的值。

輸出共n行,每行n個整數,表示a的m次冪所對應的矩陣。相鄰的數之間用乙個空格隔開。

2 2

1 2

3 4

7 10

15 22

用矩陣快速冪優化時間複雜度。

1 #include2 #include3

using namespace std;

4struct m511

} a,e;

12int

m;13 m chengji(m a,m b)//

兩個矩陣乘積結果得到乙個矩陣

1424}25

}26return

q;27

}28 m mulpower(m c,int n) //

矩陣快速冪

2937 b=chengji(b,b);

38 n>>=1;39}

40return

ans;41}

42int

main()

4353

}54 m x =mulpower(a,n);

55for(int i=0; i)

5661 printf("\n");62}

63return 0;

64 }

斐波那契數列。它的遞推公式為:f[n] = f[n-1] + f[n-2] 。 可以用矩陣表示:

1

struct

matrix

2ans,ju;56

//計算矩陣乘法的函式,引數是兩個矩陣和階數n

7 matrix mul(matrix a,matrix b,intn)8

18}19//

兩個矩陣乘積的結果

20for(i=0;i)

2128}29

}30return

tmp;31}

32//

快速冪演算法,求矩陣ju的m次冪

33void quickpower(int m,int

n)3445}

46//

如果是0,只需要直接把底數a擴大,也就是a*a...,不需要把a記錄到答案ans

m chengji(m a,m b)//兩個矩陣乘積結果得到乙個矩陣

return ans;

}int main()

}m x = mulpower(a,n);

for(int i=0; i

printf("\n");

}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...