zoukankan      html  css  js  c++  java
  • Uva 11149 Power of Matrix (倍增法/模板)

    题意:给你一个矩阵A,求A+A^2+A^3+...+A^n的矩阵,输出这个矩阵的最后一位数字

    思路:大神博客链接 :点我

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    typedef long long ll;
    int N,M,P;
    const ll MOD=10;
    struct  Matrix
    {
        ll m[45][45];
    };
    
    Matrix  A;
    
    Matrix  I;
    
    void make_I(int k)
    {
        memset(I.m,0,sizeof(I.m));
        for(int i=0;i<k;i++)
         I.m[i][i]=1;
    }
    
    Matrix multi(Matrix a,Matrix b)
    {
        Matrix ans;
        for(int i=0;i<N;i++)
        {
           for(int j=0;j<M;j++)
           {
              ans.m[i][j]=0;
              for(int k=0;k<P;k++)
              {
                 ans.m[i][j]+=a.m[i][k]*b.m[k][j]%MOD;
              }
              ans.m[i][j]%=MOD;
           }
        }
        return ans;
    }
    
    Matrix add(Matrix a,Matrix b)
    {
        Matrix ans;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<M;j++)
            {
                ans.m[i][j]=0;
                ans.m[i][j]=(a.m[i][j]+b.m[i][j])%MOD;
            }
        }
        return ans;
    }
    
    Matrix power(Matrix a,int k)
    {
        Matrix ans=I,p=a;
        while(k)
        {
          if(k&1)
          {
            ans=multi(ans,p);
          }
          k>>=1;
          p=multi(p,p);
        }
        return ans;
    }
    
    Matrix slove(const Matrix &a,int n)
    {
        if(n==1) return a;
        Matrix temp=slove(a,n/2);
        Matrix sum=add(temp,multi(temp,power(a,n/2)));
        if(n&1) sum=add(sum,power(a,n));
        return sum;
    }
    
    int main(int argc, char const *argv[])
    {
        int n,k;
        while(cin>>n>>k)
        {
            if(n==0) break;
            M=N=P=n;
            memset(A.m,0,sizeof(A.m));
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    scanf("%lld",&A.m[i][j]);
                    A.m[i][j]%=10;
                }
            }
            make_I(n);
            Matrix ans = slove(A,k);
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n-1;j++)
                {
                    cout<<ans.m[i][j]<<" ";
                }
                cout<<ans.m[i][n-1]<<endl;
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    springboot和springcloud运行在外部tomcat
    kafka-线上单机broker扩容
    kafka集群部署和测试
    k8s-学习笔记2-容器部署nginx负载均衡
    logstash部署
    docker-学习笔记7-dockerfile
    kafka常用命令
    kafka-消费滞后(Lag)监控
    kibana-部署
    es-部署
  • 原文地址:https://www.cnblogs.com/simplekinght/p/6680358.html
Copyright © 2011-2022 走看看