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

    洛谷 3390

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #define rg register
     5 #define N 110
     6 #define LL long long 
     7 using namespace std;
     8 const LL Mod=1e9+7;
     9 LL n,m,tmp[N][N];
    10 struct Mat{LL m[N][N];}a,t,ans;
    11 inline LL read(){
    12     LL k=0,f=1; char c=getchar();
    13     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    14     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
    15     return k*f;
    16 }
    17 inline void mul(Mat &a,Mat b){
    18     memset(tmp,0,sizeof(tmp));
    19     for(rg int i=1;i<=n;i++)
    20     for(rg int j=1;j<=n;j++)
    21     for(rg int k=1;k<=n;k++)
    22     tmp[i][j]+=a.m[i][k]*b.m[k][j],tmp[i][j]%=Mod;
    23     for(rg int i=1;i<=n;i++)
    24     for(rg int j=1;j<=n;j++)
    25     a.m[i][j]=tmp[i][j];
    26 }
    27 int main(){
    28     n=read(); m=read();
    29     for(rg int i=1;i<=n;i++) 
    30     for(rg int j=1;j<=n;j++) t.m[i][j]=read();
    31     for(rg int i=1;i<=n;i++) ans.m[i][i]=1;
    32     while(m){
    33         if(m&1) mul(ans,t);
    34         mul(t,t);
    35         m>>=1;
    36     }
    37     for(rg int i=1;i<=n;i++){
    38         for(rg int j=1;j<=n;j++) printf("%lld ",ans.m[i][j]);
    39         puts("");
    40     }
    41     return 0;
    42 } 
    View Code
  • 相关阅读:
    排序简介
    排序集锦
    排序图解
    UVA 11809
    uva1588kickdown
    C++中输入输出的重定向
    uva1587BOX
    uva 10340 All in All
    uva 1368 DNA Consensus String
    彻底理解MapReduce shuffle过程原理
  • 原文地址:https://www.cnblogs.com/DriverLao/p/8874739.html
Copyright © 2011-2022 走看看