poj3233矩阵的幂的和

来源:互联网 发布:赵公明 知乎 编辑:程序博客网 时间:2024/06/11 21:16
#include <iostream>#include<cstdio>#include<algorithm>#include<vector>using namespace std;int n,k,m;typedef vector<int> vec;typedef vector<vec> mat;mat mul(mat &a,mat &b){    mat c(a.size(),vec(b[0].size()));    for(int i=0;i<a.size();i++)    {        for(int k=0;k<b.size();k++)        {            for(int j=0;j<b[0].size();j++)            {                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%m;            }        }    }    return c;}mat pow(mat a,int n){    mat b(a.size(),vec(a.size()));    for(int i=0;i<a.size();i++)        b[i][i]=1;    while(n)    {        if(n&1)            b=mul(b,a);        a=mul(a,a);        n>>=1;    }    return b;}int main(){    scanf("%d%d%d",&n,&k,&m);    mat b(n*2,vec(n*2));    int t;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            scanf("%d",&t);            b[i][j]=t;        }        b[n+i][i]=b[n+i][i+n]=1;    }    b=pow(b,k+1);    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            int a=b[i+n][j]%m;            if(i==j)                a=(a+m-1)%m;            printf("%d%c",a,j+1==n?'\n':' ');        }    }    return 0;}

0 0