矩阵快速幂模板

题目描述

给定n*n的矩阵A,求A^k

输入输出格式

输入格式:
第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素

输出格式:
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7

输入输出样例

输入样例#1:
2 1
1 1
1 1

输出样例#1:
1 1
1 1

这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long

using namespace std;

const LL mod=1000000007;
const int N=201;
LL k;
int n;

struct node{
    LL m[101][101];
    node operator * (const node &a) const
    {
        node ans;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
            {
                ans.m[i][j]=0;
                for (int k=1;k<=n;k++)
                    ans.m[i][j]=(ans.m[i][j]+(LL)m[i][k]*a.m[k][j])%mod;
                //这给我们一个启示,取%时不能偷懒,还是要一步一步的进行 
            }
        return ans;        
    }
    void clear()
    {
        memset(m,0,sizeof(m));
    }
    node KSM(LL k)
    {
        k--;
        node ans=(*this),a=(*this);
        while (k)
        {
            if (k&1)
               ans=ans*a;
            a=a*a;
            k>>=1;
        }
        return ans;  
    }
};

int main()
{
    node m,ans;
    scanf("%d%lld",&n,&k);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            scanf("%lld",&m.m[i][j]);
    ans=m.KSM(k);
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=n;j++)
            printf("%lld ",ans.m[i][j]);
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673604.html