zoukankan      html  css  js  c++  java
  • 【luogu 3390】【模板】矩阵快速幂

    题目背景

    矩阵快速幂

    题目描述

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

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define ll long long
     6 using namespace std;
     7 const ll Mod=1000000007;
     8 ll n,k;
     9 struct matrix{ll m[105][105];}a;
    10 matrix multiply(matrix a,matrix b){
    11     matrix t;
    12     for(int i=1;i<=n;i++)
    13         for(int j=1;j<=n;j++){
    14             t.m[i][j]=0;
    15             for(int k=1;k<=n;k++)
    16                 t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%Mod;
    17         }
    18     return t;
    19 }
    20 matrix fast(matrix a,ll p){
    21     matrix ans=a;p--;
    22     while(p>0){
    23         if(p&1) ans=multiply(ans,a);
    24         a=multiply(a,a);
    25         p>>=1;
    26     }
    27     return ans;
    28 }
    29 int main(){
    30     scanf("%lld%lld",&n,&k);
    31     for(int i=1;i<=n;i++)
    32         for(int j=1;j<=n;j++)
    33             scanf("%lld",&a.m[i][j]);
    34     a=fast(a,k);
    35     for(int i=1;i<=n;i++){
    36         for(int j=1;j<=n;j++)
    37             printf("%lld ",a.m[i][j]);
    38         printf("
    ");
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    解决电脑故障通用三部曲
    为什么有的人留邮箱的时候会把@写成#
    试用DreamWeaver CS6
    在CSDN上提问
    视频网站保存观看记录相关
    QQ浏览器设置无效后重新设置
    FastCopy总结
    如何在PC上多开微信
    Messager不能撤回消息
    用CSS3动画 animation实现图片旋转
  • 原文地址:https://www.cnblogs.com/Emine/p/7644658.html
Copyright © 2011-2022 走看看