poj3233
矩阵+二分,建议用面向对象思想
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m,n,K;
int a[30][30];
class Matrix
{
public:
int num[4*30][4*30];
Matrix()
{
memset(num,0,sizeof(num));
}
void print()
{
for(int i=0;i<n;++i)
{
printf("%d",num[i][0]);
for(int j=1;j<n;++j)
printf(" %d",num[i][j]);
printf("\n");
}
printf("\n");
}
friend Matrix& operator *(Matrix max1,Matrix max2);
};
Matrix& operator *(Matrix max1,Matrix max2)
{
Matrix tmp;
for(int i=0;i<2*n;++i)
for(int j=0;j<2*n;++j)
{
for(int k=0;k<2*n;++k)
tmp.num[i][j]+=(max1.num[i][k]*max2.num[k][j])%m;
tmp.num[i][j]%=m;
}
return tmp;
}
int main()
{
scanf("%d %d %d",&n,&K,&m);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
scanf("%d",&a[i][j]);
Matrix b,c;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
c.num[i+n][j+n]=b.num[i][j+n]=a[i][j];
for(int k=0;k<2;++k)
for(int i=0;i<n;++i)
c.num[i+k*n][i]=1;
while(K)
{
if(K&1)
b=b*c;
K>>=1;
c=c*c;
}
b.print();
return 0;
}
浙公网安备 33010602011771号