矩阵快速幂 模板

#include<cstdio>
#include<cmath>//pow函数,其实没啥用 
using namespace std;

int n;long long k;
const int N=pow(10,9)+7;
struct node{long long  a[105][105];};
node shu,ans,mp;
//shu是输入的矩阵,ans是所求答案
node matrix(node x,node y){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            mp.a[i][j]=0;
            for(int p=1;p<=n;p++)
                mp.a[i][j]=(mp.a[i][j]+x.a[i][p] * y.a[p][j])%N;
            //矩阵乘法 
        }
    return mp;
}

int work(long long k){//矩阵快速幂 
    while(k){
        if(k&1) 
            ans=matrix(ans,shu);
        k>>=1;
        shu=matrix(shu,shu);
    }
}

int main(){
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;i++){ 
        for(int j=1;j<=n;j++)
            scanf("%d",&shu.a[i][j]);
        ans.a[i][i]=1;//任何一个矩阵乘以单位矩阵,其值等于本身;
    }       

    work(k);

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            printf("%d ",ans.a[i][j]);
        printf("\n");
    }
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/MallowFlower/article/details/81507145