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

    顺手写了下矩阵类模板

      利用到矩阵乘法的交换律 (A*B)^n == A * (B*A)^n-1 *B

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <utility>
    #include <stack>
    #include <queue>
    #include <map>
    #include <deque>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)<(y)?(x):(y))
    #define INF 0x3f3f3f3f
    #define MOD 6
    
    using namespace std;
    
    int n,m;
    
    struct Matrix{
        int n,m;
        vector< vector<int> >a;
        Matrix(){};
        Matrix(const Matrix & T) : n(T.n),m(T.m)
        {
            a.resize(n);
            for(int i=0; i<n; i++)
            {
                a[i].resize(m);
                for(int j=0; j<m; j++)
                    a[i][j]=T.a[i][j];
            }
        }
        Matrix(int N, int M)
        {
            n=N;
            m=M;
            a.resize(N);
            for(int i=0; i<N; i++)
                a[i].resize(M);
        }
        Matrix & operator=(const Matrix &T)
        {
            n=T.n;
            m=T.m;
            a.resize(n);
            for(int i=0; i<n; i++)
            {
                a[i].resize(m);
                for(int j=0; j<m; j++)
                    a[i][j]=T.a[i][j];
            }
            return *this;
        }
        Matrix operator+(const Matrix &T) const
        {
            Matrix tmp(n,m);
            for(int i=0; i<n; i++)
                for(int j=0; j<m; j++)
                tmp.a[i][j]=a[i][j]+T.a[i][j];
            return tmp;
        }
        Matrix operator*(const Matrix &T) const
        {
            Matrix tmp(n,T.m);
            for(int i=0; i<n; i++)
                for(int j=0; j<T.m; j++)
                    for(int k=0; k<m; k++)
                    tmp.a[i][j]=(tmp.a[i][j]+a[i][k]*T.a[k][j])%MOD;
            return tmp;
        }
        void input(int N, int M)
        {
            n=N;
            m=M;
            a.resize(n);
            for(int i=0; i<n; i++)
            {
                a[i].resize(m);
                for(int j=0; j<m; j++)
                scanf("%d",&a[i][j]);
            }
        }
        void output()
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                    printf("%d ",a[i][j]);
                printf("
    ");
            }
        }
        Matrix pow_m(int N)//矩阵满足n=m
        {
            Matrix ret(n,n),tmp(*this);
            for(int i=0; i<n; i++)
                ret.a[i][i]=1;
            while(N)
            {
                if(N&1) ret=ret*tmp;
                tmp=tmp*tmp;
                N>>=1;
            }
            return ret;
        }
    };
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF && n && m)
        {
            Matrix a,b,c,d;
            a.input(n,m);
            b.input(m,n);
            c=b*a;
            d=c.pow_m(n*n-1);
            d=a*d*b;
            int ans=0;
            for(int i=0; i<d.n; i++)
                for(int j=0; j<d.m; j++)
                ans=ans+d.a[i][j];
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    GCDPlot已提交到Sourceforge,成为开源项目[GCDPlot become a open source software in sourceforge]
    GCDPlot 0.32
    谈谈“科技人员和白领是购买盗版的主力”
    c正则匹配小计
    C++ 模板惯用法
    C++模板常用使用方法介绍
    常用正则表达式
    C++ 容易忘的基本语法和特性
    C++ 对象资源管理惯用法
    Int? 代表什么意思, 可为空的值类型(Nullable<T>)需要注意的地方
  • 原文地址:https://www.cnblogs.com/Mathics/p/3923149.html
Copyright © 2011-2022 走看看