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

    题目描述

    给定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 <algorithm>
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 using namespace std;
     8 typedef long long ll;
     9 const int N=105,mod=1000000007;
    10 int n;ll k;
    11 struct mat{
    12     ll a[N][N];
    13     inline mat operator *(const mat &b)const{
    14         mat tmp;
    15         for(int i=1;i<=n;i++)
    16             for(int j=1;j<=n;j++)
    17                 {
    18                     tmp.a[i][j]=0;
    19                     for(int k=1;k<=n;k++)
    20                         tmp.a[i][j]+=a[i][k]*b.a[k][j],tmp.a[i][j]%=mod;
    21                 }
    22         return tmp;
    23     }
    24 }a;
    25 mat qm(mat a,ll k){
    26     mat tmp=a;k--;
    27     while(k){
    28         if(k&1)tmp=tmp*a;
    29         k>>=1;a=a*a;
    30     }
    31     return tmp;
    32 }
    33 int main()
    34 {
    35 
    36     scanf("%d%lld",&n,&k);
    37     for(int i=1;i<=n;i++)
    38         for(int j=1;j<=n;j++)
    39             scanf("%lld",&a.a[i][j]);
    40     a=qm(a,k);
    41     for(int i=1;i<=n;i++){
    42         for(int j=1;j<=n;j++)
    43             printf("%lld ",a.a[i][j]);
    44         puts("");
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    序列
    2018131
    成都七中
    NOIP2017
    洛谷P1352 CodeVS1380 没有上司的舞会
    BZOJ1087 SCOI2005 互不侵犯King
    11-4-2017 星期六 R-Day?
    11-3-2017 星期五
    11-2-2017 星期四
    USACO 2014 US Open, Silver Problem 2. Dueling GPSs
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7138168.html
Copyright © 2011-2022 走看看