poj 3233 矩阵幂取模

#include<iostream>
using namespace std;
struct node{int p[100][100];};
node a,b;
int num,n,qq;
node cheng(node a,node b)
{
	node c;
	int j,i,w,k;
	for(i=0;i<num;i++)
		for(j=0;j<num;j++)
		{
			int w=0;
			//c.p[i][j]=0;
			for(k=0;k<num;k++)
				w+=(a.p[i][k]*b.p[k][j])%qq;
			c.p[i][j]=w%qq;
		}
	return c;
}

void solve(int m)
{
	while(m)
	{
		if(m%2==1)
			b=cheng(a,b);
		a=cheng(a,a);
		m/=2;
	}
}

int main()
{
	int i,j,k,m;
	while(~scanf("%d",&n))
	{
		scanf("%d %d",&m,&qq);
		num=n*2;
		for(i=0;i<num;i++)
			for(j=0;j<num;j++)
				a.p[i][j]=0;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				scanf("%d",&a.p[i][j]);
			for(i=0;i<n;i++)
				a.p[i][i+n]=a.p[i+n][i+n]=1;
		for(i=0;i<num;i++)
			for(j=0;j<num;j++)
			{
				if(i==j)
					b.p[i][j]=1;
				else b.p[i][j]=0;
			}
			solve(m+1);
			for(i=0;i<n;i++)
			{
				for(j=0;j<n;j++)
				{
					if(i==j)
					{
						b.p[i][j+n]-=1;    //若该值取余后为0 再减一 就成负数了  这一细节我一直都没有发现  wa后 测出确实有负数  找了好久的错误 我还以为是程序别的地方有问题 。。直到
						if(b.p[i][j+n]<0)// 看了 奖金的博客
							b.p[i][j+n]+=qq;

					} 	
						if(j==n-1)
							printf("%d\n",b.p[i][j+n]);
						else
							printf("%d ",b.p[i][j+n]);
				}
				
			}
	}
	return 0;
}

  

posted @ 2013-05-30 20:28  galaxy77  阅读(137)  评论(0编辑  收藏  举报