码迷,mamicode.com
首页 > 其他好文 > 详细

LuoguP3390|【模板】矩阵快速幂|板子

时间:2019-01-06 12:47:41      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:int   mes   cpp   name   printf   矩阵   long   class   com   

目录

快速幂

板子

long long qpow(long long a,long long b){
    long long ans=1,base=a;
    while(b){
        if(b&1) ans=ans*base%c;
        base=base*base%c;
        b>>=1;
    }
    return ans%c;
}

矩阵快速幂

Problem

技术分享图片

板子

#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const ll mod=1000000007;
const int maxn=105;
ll n,k;
struct mat{ll m[maxn][maxn];};
mat a;
mat mul(mat a,mat b){
    mat c;
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.m[i][j]=0; 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                c.m[i][j]=c.m[i][j]%mod+a.m[i][k]*b.m[k][j]%mod;
    return c;
}
mat qpow(mat a,ll b){
    mat ans,base=a;
    //构造单位矩阵
    //单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。
    //它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。 
    for(int i=1;i<=n;i++) ans.m[i][i]=1;
    while(b){
        if(b&1) ans=mul(ans,base);
        base=mul(base,base);
        b>>=1; 
    }
    return ans;
}
int main(){
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%lld",&a.m[i][j]);
    mat ans=qpow(a,k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++) printf("%lld ",ans.m[i][j]%mod);
        printf("\n");
    }
    return 0;
}

LuoguP3390|【模板】矩阵快速幂|板子

标签:int   mes   cpp   name   printf   矩阵   long   class   com   

原文地址:https://www.cnblogs.com/saitoasuka/p/10228263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!