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;
}
原文地址:https://www.cnblogs.com/simplekinght/p/6680358.html