POJ 3233

题意:就矩阵幂的和

做法:线性代数课上有,单个矩阵也是可以当成一个矩阵中的元素的

所以构建矩阵|A o|                                                 |A|

                        |E E| 其中o 是零矩阵。,和矩阵|o|,在计算第一矩阵的n次幂之后再与第二个矩阵相乘,这样,就在第二个矩阵的o矩阵处,就是答案

#include<cstdio>
#include<cstring>
#define LMT 65
using namespace std;
typedef class matrix
{
    public:
    int n,m;
    void init(void)
    {
        memset(mat,0,sizeof(mat));
    }
    int mat[LMT][LMT];
    friend matrix operator *(const matrix&,const matrix&);
}matrix;
matrix a,trans;
int n,k,mod;
 matrix operator *(const matrix& a,const matrix &b)
{
    matrix tem;
    tem.n=a.n;tem.m=b.m;
    for(int i=0;i<a.n;i++)
      for(int j=0;j<b.m;j++)
      {
          tem.mat[i][j]=0;
          for(int t=0;t<a.m;t++)
          tem.mat[i][j]=(tem.mat[i][j]+a.mat[i][t]*b.mat[t][j])%mod;
      }
      return tem;
}
int main(void)
{
    while(scanf("%d%d%d",&n,&k,&mod)!=EOF)
    {
        matrix tem;
        tem.init();
        tem.n=tem.m=n<<1;
        a.init();
        trans.init();
        a.n=n<<1;a.m=n;
        trans.m=trans.n=n<<1;
        for(int i=0;i<n;i++)
        {
         for(int j=0;j<n;j++)
         {
           scanf("%d",&a.mat[i][j]);
           a.mat[i][j]%=mod;
           trans.mat[i][j]=a.mat[i][j];
         }
         trans.mat[i+n][i+n]=trans.mat[i+n][i]=1;
        }
        for(int i=0;i<n<<1;i++)
            tem.mat[i][i]=1;
        while(k)
        {
            if(k&1)tem=tem*trans;
            trans=trans*trans;
            k>>=1;
        }
        trans=tem;
        a=trans*a;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            printf("%d ",a.mat[i+n][j]);
            printf("\n");
        }
    }
    return 0;
}


你可能感兴趣的:(POJ 3233)