todo 矩阵快速幂 王道P104

//todo 矩阵快速幂  王道P104
#include <iostream>
#include <cstdio>
using  namespace std;

struct Matrix{
    int matrix[10][10];
    int row,col;
    Matrix(int r,int c):row(r),col(c){}
};

void PrintMatrix(Matrix x){
    for(int i=0;i<x.row;++i){
        for(int j=0;j<x.col;++j){
           if(j!=0) printf(" ");
           printf("%d",x.matrix[i][j]);
        }
        printf("\n");
    }
    return;
}
Matrix Mutiply(Matrix x,Matrix y){ //矩阵乘法
    Matrix answer(x.row,y.col);
    for(int i=0;i<answer.row;++i){
        for(int j=0;j<answer.col;++j){
            answer.matrix[i][j] = 0;
            for(int k=0;k<x.col;++k){
                answer.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];
            }

        }
    }
    return answer;
}
Matrix FastExponentiation(Matrix x,int k){
    Matrix answer(x.row,x.col);
    for(int i=0;i<answer.row;++i){
        for(int j=0;j<answer.col;++j){
            if(i==j){
                answer.matrix[i][j] = 1;
            }else{
                answer.matrix[i][j] = 0;
            }
        }
    }
    while(k != 0){  //不断将k转换为二进制  todo
        if(k%2 == 1){
            answer = Mutiply(answer,x); //累乘x的 2的k次幂
        }
        k /= 2;
        x = Mutiply(x,x); //x不断平方

    }

    return answer;

}
int main(){
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF){
        Matrix x(n,n);
        for(int i=0;i<x.row;++i){
            for(int j=0;j<x.col;++j){
                scanf("%d",&x.matrix[i][j]);
            }
        }
        Matrix answer = FastExponentiation(x,k);
        PrintMatrix(answer);
    }
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
11-11 16:40
已编辑
门头沟学院 人工智能
不知道怎么取名字_:这个有点不合理了,相当于已经毕业了,但还是没转正,这不就是白嫖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务