矩阵快速幂

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1000000007;
int n;
long long k;
long long read(){
    long long x=0;
    int f=1;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(isdigit(c)){
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar();
    }
    return x*f;
}
struct cube{
    long long a[105][105];
    cube(){
        memset(a,0,sizeof(a));
    }
    inline void build(){
        for(int i=1;i<=n;i++)
            a[i][i]=1;
    }
}A;
cube operator*(const cube &l,const cube &r){
    cube c;
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                c.a[i][j]+=((l.a[i][k]%mod)*(r.a[k][j]%mod))%mod;
                c.a[i][j]%=mod;
            }
        }
    }
    return c;
}
int main(){
    n=read();
    k=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            A.a[i][j]=read();
    cube ans;
    ans.build();
    
    while(k){
        if(k&1) ans=ans*A;
        A=A*A;
        k>>=1;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            printf("%lld ",ans.a[i][j]);
        puts("");
    }return 0;
}

 主要就是关于重载运算符的问题,矩阵快速幂的思想等同于普通快速幂的思想,但矩阵乘法的“K”要放在两层循环外

posted @ 2019-06-11 16:26  _Alex_Mercer  阅读(158)  评论(0编辑  收藏  举报