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

洛谷 P3390 【模板】矩阵快速幂

时间:2017-07-19 20:34:17      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:格式   --   矩阵   target   type   line   span   targe   amp   

题目背景

矩阵快速幂

题目描述

给定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

说明

n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂

 

学习网站

屠龙宝刀点击就送 

#include <ctype.h>
#include <cstdio>

typedef long long LL;
#define Mod 1000000007

void read(LL &x)
{
    x=0;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-0;
}
LL k,n;
struct node
{
    LL a[150][150];
    inline node operator*(const node &b)const
    {
        node c;
        for(LL i=1;i<=n;i++)
        {
            for(LL j=1;j<=n;j++)
            {
                c.a[i][j]=0;
                for(LL k=1;k<=n;k++)
                c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j])%Mod;
            }
        }
        return c;
    }
}A,ans;
int main(int argc,char *argv[])
{
    read(n);
    read(k);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            read(A.a[i][j]);
    ans=A;k--;
    for(;k;k>>=1LL,A=A*A)
        if(k&1) ans=ans*A;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            printf("%d ",ans.a[i][j]);
        printf("\n");
    }
    return 0;
}

 

洛谷 P3390 【模板】矩阵快速幂

标签:格式   --   矩阵   target   type   line   span   targe   amp   

原文地址:http://www.cnblogs.com/ruojisun/p/7207555.html

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