POJ 3233

来源:互联网 发布:网络奇兵2重制版 编辑:程序博客网 时间:2024/05/14 16:44

题意:就矩阵幂的和

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

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

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

#include<cstdio>#include<cstring>#define LMT 65using 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;}


原创粉丝点击