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 }
  • 相关阅读:
    JS 给li标签下所有a标签添加点击事件并添加和删除样式
    Linux简介及常用命令
    简易计算器
    登陆窗口小项目
    时间工具类
    String类的常用方法(附带练习)
    java-自定义异常
    Java小练习
    Java-接口练习1
    动态加载js
  • 原文地址:https://www.cnblogs.com/Emine/p/7644658.html
Copyright © 2011-2022 走看看