1. 程式人生 > 實用技巧 >快速冪和矩陣快速冪

快速冪和矩陣快速冪

快速冪

快速冪主要運用了分治的思想

程式碼模板如下

int quickPower(int a, int b)//是求a的b次方
{
    int ans = 1, base = a;//ans為答案,base為a^(2^n)
    while(b > 0)//b是一個變化的二進位制數,如果還沒有用完
    {
        if(b & 1)//&是位運算,b&1表示b在二進位制下最後一位是不是1,如果是:
            ans *= base;//把ans乘上對應的a^(2^n)

        base *= base;//base自乘,由a^(2^n)變成a^(2^(n+1))
        b >>= 1;
    }
    return ans;
}

以及快速冪模

int pow_mod(int a,int b,int c){//求a的b次方模c的結果
    int ans = 1;
    int base = a%c;
    while(b){
        if(b & 1) ans = (ans*base)%c;
        base = (base*base)%c;
        b >>= 1;
    }
    return ans;
}

矩陣快速冪

而掌握了快速冪的程式碼 實現矩陣快速冪也十分簡單 只需要用一個結構體實現矩陣的邏輯 並重載乘法符號 套用上面的模板就好

結構體實現矩陣

struct ahaha{
    ll a[maxn][maxn];     //一般用long long 資料
    ahaha(){
        memset(a,0,sizeof a);
    }
    inline void build(){     //構建單位矩陣
        for(int i=1;i<=n;++i)a[i][i]=1;
    }
}a;

運算子過載

ahaha operator *(const ahaha &x,const ahaha &y){     
    ahaha z;
    for(int k=1;k<=n;++k)
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;
    return z;
}

然後就可以套用快速冪公式來實現矩陣快速冪(ans,base需要是結構體定義的矩陣)
例題

洛谷P3390
洛谷P1939