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

    代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<string>
     7 #include<algorithm>
     8 #include<time.h>
     9 using namespace std;
    10 #define mod 1000000007
    11 #define ll long long 
    12 ll read(){
    13     ll ans=0;
    14     char last=' ',ch=getchar();
    15     while(ch<'0' || ch>'9')last=ch,ch=getchar();
    16     while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    17     if(last=='-')ans=-ans;
    18     return ans;
    19 }//快读 
    20 struct matrix{
    21     ll m[105][105];
    22 };//定义蒟阵 
    23 ll n,k;
    24 matrix a,c,e;
    25 matrix cheng(matrix x,matrix y)//定义蒟阵乘法 
    26 {
    27     matrix c;
    28     for(ll i=1;i<=n;i++)
    29         for(ll j=1;j<=n;j++)
    30             c.m[i][j]=0;//初始化0 
    31     for(int i=1;i<=n;i++)
    32       for(int j=1;j<=n;j++)
    33         for(int k=1;k<=n;k++)
    34         {
    35             c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;//按照定义计算喽 
    36         }
    37     return c;
    38 }
    39 matrix pow(matrix x,ll y)//定义蒟阵快速幂(注意要用蒟阵的乘法,其他相同) 
    40 {
    41     matrix ans=e;
    42     while(y)
    43     {
    44         if(y&1)
    45         {
    46             ans=cheng(ans,x);
    47         }
    48         x=cheng(x,x);
    49         y>>=1;
    50     }
    51     return ans;
    52 }
    53 int main()
    54 {
    55     n=read(),k=read();
    56     for(ll i=1;i<=n;i++)
    57         e.m[i][i]=1;//单位蒟阵 
    58     for(ll i=1;i<=n;i++)
    59         for(ll j=1;j<=n;j++)
    60         {
    61             a.m[i][j]=read();//读入 
    62         }
    63     matrix ans=pow(a,k);
    64     for(ll i=1;i<=n;i++)
    65     {
    66         for(ll j=1;j<=n;j++)
    67         {
    68             cout<<ans.m[i][j]%mod<<" ";
    69         }
    70         cout<<endl;
    71     }    
    72     return 0;//结束喽 
    73 }

    如果要写蒟阵乘法的话,稍微修改一下就可以了:

    int main()
    {
        for(int i=1;i<=m;i++)
            for(int j=1;i<=n;j++)
            {
                c[i][j]=0;
                for(int k=1;i<=p;k++)
                    c[i][j]+=a[i][k]*b[k][j];
            }
     } 
  • 相关阅读:
    redis 基本指令
    php 魔术变量
    php 常用函数总结
    linux 命令——3 pwd (转)
    linux 命令——2 cd (转)
    linux 命令——ls
    ffmeg过滤器介绍[转]
    最简单的基于FFMPEG的转码程序 —— 分析
    ffmpga结构体和常用函数(总结)
    leetcode--3
  • 原文地址:https://www.cnblogs.com/lcezych/p/10656705.html
Copyright © 2011-2022 走看看