快速冪 矩陣快速冪

2021-10-04 15:23:21 字數 1979 閱讀 1953

如果要你自己寫乙個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...