1. 程式人生 > >【快速冪】【矩陣快速冪】

【快速冪】【矩陣快速冪】

快速冪:
一般求x的n次方,可以直接使用迴圈來O(n)求解,但是效率在一些題目中並不高,因此就有了快速冪這個演算法。簡單來說,當我們筆算123的4次方時,通常會先算123的平方再用所得的數再平方運算,而不是連續乘4次,因為相比3次乘法,2次費的時間更少一點,至少我們心理是這麼覺得的,快速冪正是基於這樣一種思想,程式碼實現如下。

int ksm(int x,int n,int mo)
{
    int ans=1;
    while(n)
    {
        if (n&1) ans=(ans*x)%mo;
        x=(x*x)%mo;
        n>>=1
; } return ans; }

矩陣快速冪:
這裡以求斐波那契數列為例

int jz_multi (long long x1[3][3],long long x2[3][3])
{
    long long c[3][3]={0};
    for (int i=0;i<3;i++)
    for (int j=0;j<3;j++)
    for (int k=0;k<3;k++)
    c[i][j]=(c[i][j]+(x1[i][k]*x2[k][j])%mo)%mo;

    for (int i=0;i<3;i++)
    for
(int j=0;j<3;j++) x1[i][j]=c[i][j]; return 0; } int ksm(long long x) { while(x) { if (x&1) jz_multi(jz_0,jz_1); jz_multi(jz_1,jz_1); x>>=1; } }