矩阵快速幂 | 北邮OJ | 96. 矩阵幂

版权声明:本文纯属作者口胡,欢迎转载 https://blog.csdn.net/TQCAI666/article/details/86673441

https://vpn.bupt.edu.cn/http/10.105.242.80/problem/p/96/
reference: https://www.cnblogs.com/cmmdc/p/6936196.html

  • 快速幂
ll quickPower(ll a,ll b){
    ll ans=1,base=a;
    while(b>0){
        if(b&1)
            ans*=base;
        base*=base;
        b>>=1;
    }
    return ans;
}

  • 矩阵乘法
matrix* multi(matrix& A, matrix& B){
    matrix* C=new matrix;
    C->row=A.row;
    C->col=B.col;
    for(int i=0;i<A.row;i++)
        for(int j=0;j<B.col;j++)
            for(int k=0;k<A.col;k++)
                C->m[i][j]+=A.m[i][k]*B.m[k][j];
    return C;
}
  • 矩阵快速幂
matrix quickPower(matrix& A,int p){    //A^p
    int n=A.col;
    //得到单位阵
    matrix ans(n,n);//ans=E
    FF(i,n)
        FF(j,n)
            if(i==j)
                ans.m[i][j]=1;
            else
                ans.m[i][j]=0;
    //开始快速幂
    matrix base=A;
    while(p){
        if(p&1)
            ans=*multi(ans,base);
        base=*multi(base,base);
        p>>=1;
    }
    return ans;
}

本题代码

#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;

using namespace std;
typedef long long ll;

typedef struct matrix{
    int m[LEN][LEN];
    int row,col;
    matrix(int row,int col):row(row),col(col){}
    matrix(){
    }
    void input(){
        FF(i,row)
            FF(j,col)
                scanf("%d",&this->m[i][j]);
    }
    void output(){
        FF(i,row)
        {
            FF(j,col)
            {
                printf("%d",this->m[i][j]);
                if(j!=col-1) putchar(' ');
            }
            printf("\n");
        }
    }
}matrix;

matrix* multi(matrix& A, matrix& B){
    matrix* C=new matrix;
    C->row=A.row;
    C->col=B.col;
    for(int i=0;i<A.row;i++)
        for(int j=0;j<B.col;j++)
            for(int k=0;k<A.col;k++)
                C->m[i][j]+=A.m[i][k]*B.m[k][j];
    return C;
}


matrix quickPower(matrix& A,int p){    //A^p
    int n=A.col;
    //得到单位阵
    matrix ans(n,n);//ans=E
    FF(i,n)
        FF(j,n)
            if(i==j)
                ans.m[i][j]=1;
            else
                ans.m[i][j]=0;
    //开始快速幂
    matrix base=A;
    while(p){
        if(p&1)
            ans=*multi(ans,base);
        base=*multi(base,base);
        p>>=1;
    }
    return ans;
}

int main()
{
//    freopen("./in","r",stdin);
    int N;
    scanf("%d",&N);
    while(N--){
        int n,p;
        scanf("%d%d",&n,&p);
        matrix A(n,n);
        A.input();
        quickPower(A,p).output();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/TQCAI666/article/details/86673441