zoukankan      html  css  js  c++  java
  • 1113 矩阵快速幂

    1113 矩阵快速幂

    给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果。
    Input
    第1行:2个数N和M,中间用空格分隔。N为矩阵的大小,M为M次方。(2 <= N <= 100, 1 <= M <= 10^9)
    第2 - N + 1行:每行N个数,对应N * N矩阵中的1行。(0 <= N[i] <= 10^9)
    Output
    共N行,每行N个数,对应M次方Mod (10^9 + 7)的结果。
    Input示例
    2 3
    1 1
    1 1
    Output示例
    4 4
    4 4

    思路:模板
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int mod=1e9+7;
     4 typedef long long ll;
     5 int n,m;
     6 struct prog
     7 {
     8     ll  a[102][102];
     9 };
    10 prog s,B;
    11 prog matrixmul(prog a,prog b)
    12 {
    13    prog c;
    14      for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
    15    {
    16        c.a[i][j]=0;
    17        for(int k=1;k<=n;k++)
    18             c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
    19          c.a[i][j]%=mod;
    20    }
    21       return c;
    22 }
    23 prog mul(prog s,int k)
    24 {
    25      prog ans;
    26      for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) ans.a[i][j]=(i==j)?1:0;
    27      while(k){
    28         if(k&1)
    29             ans=matrixmul(ans,s);
    30         k>>=1;
    31         s=matrixmul(s,s);
    32     }
    33       return ans;
    34 }
    35 
    36 int main(){
    37     scanf("%d%d",&n,&m);
    38     prog s;
    39     for(int i=1;i<=n;i++){
    40         for(int j=1;j<=n;j++)
    41             scanf("%I64d",&s.a[i][j]);
    42     }
    43     s=mul(s,m);
    44     for(int i=1;i<=n;i++){
    45         for(int j=1;j<=n;j++){
    46             printf("%I64d",(s.a[i][j]+mod)%mod);
    47             if(j!=n) printf(" ");
    48         }
    49         printf("
    ");
    50     }
    51 }
  • 相关阅读:
    omnibus gitlab-ce安装
    Helm
    pod状态为Back-off
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    云主机搭建Kubernetes 1.10集群
    Linux清除Windows密码
    Nginx负载均衡之健康检查
    MariaDB主从复制搭建
    Python基础
    Tomcat URL重写
  • 原文地址:https://www.cnblogs.com/hhxj/p/7050450.html
Copyright © 2011-2022 走看看