zoukankan      html  css  js  c++  java
  • 矩阵模板

    大概介绍两种写矩阵的方法,各有优缺点。

    一种是用结构体实现,也许运行起来会比较快?

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int mod = (int)1e9+7 ;
     5 
     6 void add (int &a , int b) {
     7     a += b ; if (a<0) a+=mod ; if (a>=mod) a-=mod ;
     8 }
     9 
    10 struct mat {
    11     int e[50][50] , n , m ;
    12     mat () {}
    13     mat (int _n , int _m) : n(_n) , m(_m) {
    14         for (int i=0 ; i<n ; i++) memset (e[i],0,sizeof(int)*m) ;
    15     }
    16     mat operator * (const mat &rhs) { 
    17         mat ret(n,rhs.m) ;
    18         for (int i=0 ; i<n ; i++)
    19             for (int j=0 ; j<rhs.m ; j++)
    20                 for (int z=0 ; z<m ; z++)
    21                     add(ret.e[i][j],1ll*e[i][z]*rhs.e[z][j]%mod) ;
    22         return ret ;
    23     }
    24 } ;
    25 
    26 int main () {
    27     //请赋值
    28     mat b(3,3) ;
    29     //建立单位矩阵
    30     mat ans(3,3) ;
    31     for (int i=0 ; i<3 ; i++) ans.e[i][i] = 1 ;
    32     int cnt = 1000000000 ;
    33     for ( ; cnt ; cnt>>=1) {
    34         if (cnt&1) ans = ans*b ;
    35         b = b*b ;
    36     }
    37     return 0 ;
    38 }

    另外一种是利用vector<>,用vector<vector<> >来定义矩阵的类型,写起来很快?

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef vector<int> vec ;
     5 typedef vector<vec> mat ;
     6 const int mod = (int)1e9+7 ;
     7 
     8 inline void add (int &a ,int b) {
     9     a += b ; if (a>=mod) a-=mod ; if (a<0) a+=mod ;
    10 }
    11 
    12 mat mul (const mat &a , const mat &b) {
    13     mat ret(a.size(),vec(b[0].size())) ;
    14     for (int i=0 ; i<a.size() ; i++)
    15         for (int j=0 ; j<b[0].size() ; j++)
    16             for (int z=0 ; z<b.size() ; z++)
    17                 add(ret[i][j],1ll*a[i][z]*b[z][j]%mod) ;
    18     return ret ;
    19 }
    20 
    21 int main () {
    22     mat b(3,vec(3)) ;
    23     for (int i=0 ; i<3 ; i++) for (int j=0 ; j<3 ; j++) scanf("%d",&b[i][j]);
    24     mat ans(3,vec(3)) ;
    25     for (int i=0 ; i<ans.size() ; i++) ans[i][i] = 1 ;
    26     int cnt = 1000000000 ;
    27     for ( ; cnt ; cnt>>=1) {
    28         if (cnt&1) ans = mul(ans , b) ;
    29         b = mul(b , b) ;
    30     }
    31     return 0 ;
    32 }

    可以把这个看一下 https://github.com/halfapri/half/tree/master/carbuncle/Matrix

    理论上来说其实看了也不能a题。。。所以你们可以好好看看大牛们的博客。反正核心是dp(推公式),嗯=。= 记住这点就好。

  • 相关阅读:
    12月15日,progress_dispaly
    Android studio和Genymotion-VirtualBox的配合使用
    JDK7动态代理源码分析
    跟踪mqttv3源码(二)
    跟踪mqttv3源码(一)
    Spring自定义标签
    Eclipse发布Maven项目到远程服务器
    结合实际项目分析pom.xml
    Maven的安装环境配置
    PHP7新特性
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/5689096.html
Copyright © 2011-2022 走看看