降低時間複雜度,使用盡量少的相乘次數。
例如: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斐波那契數列。它的遞推公式為:f[n] = f[n-1] + f[n-2] 。 可以用矩陣表示: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 }
1struct
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...