如果要你自己寫乙個pow()函式,需要求2的2000000000次方,怎麼求?
int
pow(
int a,
int b)
上述**的時間複雜度是o(n),當資料數量級很大的時候,這份**的耗時會非常巨大,並不能解決我們的問題。那我們該怎麼辦呢?
以2的74次方為例,74的二進位制為1001010。對應的,我們得到74=2+8+64。
我們把問題轉化為2的74次方 =2的2次方 * 2的8次方 * 2的64次方 。通過這個思路,這樣我們把演算法的複雜度降到了o(log n)。
void
pow(
long
long a,
long
long b)
//快速冪 求a的b次冪
printf
("%lld"
,s);
}
**
我們都知道斐波那契數列 ,而 f[n] =f[n-1]+f[n-2]。
顯然,採用遞加的方式求f[n]我們需要運算 n-1次。當資料數量級很大的時候,在有限的時間內,我們是無法答案的。那麼我們該怎麼辦呢?
思路一:先來看斐波那契數列 ,我們先初始化三個矩陣令a[2][2]=,b[2]=,c[2][1]=。那麼是不是會有 c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]=1+1=2。
c[1][0]=a[1][0]*b[0][0]+a[1][1]b[1][0]=1+0=1。
即:
乘號右側的所有元素組成斐波那契數列的元素,我們可以用c[0][0]表示。那麼我們這樣做有什麼好處呢?理由同快速冪,因為這樣f[n]=a矩陣的n-1次方b矩陣 。這樣一來 ,我們只不過是把底數換成了乙個矩陣而已,利用上述的思路可以將時間複雜度大大降低。我們把矩陣a稱為轉移矩陣,用陣列表示是[1,1,1,0]。最後的答案我們可以通過a的n-1次方獲得。
#include
#include
#include
int n,c[2]
[2],d[2]
[2],a[2]
[2]=
,b[2][
2]=;
void
matrix1()
}}for(
int i=
0;i<
2;i++)}
}void
matrix2()
}}for(
int i=
0;i<
2;i++)}
}int
main()
printf
("%d "
,b[0][
0]+b[0][
1]);
}return0;
}
思路二:矩陣快速冪與斐波那契數列
#include
#include
#include
int n,c[2]
[2],d[2]
[2],a[2]
[2]=
,b[2][
2]=;
void
matrix1()
}}for(
int i=
0;i<
2;i++)}
}void
matrix2()
}}for(
int i=
0;i<
2;i++)}
}int
main()
printf
("%d "
,b[0][
1]);
return0;
}
如有不妥,歡迎指正。 快速冪(矩陣快速冪)
求 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...