HDU1575(快速幂)

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1783    Accepted Submission(s): 1313


Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
 

Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
 

Output
对应每组数据,输出Tr(A^k)%9973。
 

Sample Input
   
   
   
   
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
 

Sample Output
   
   
   
   
2 2686
 


//简单的矩阵的快速幂,注意不能是中间过程溢出

#include<iostream> 
#include<cstring>
using namespace std;


const int mod=9973;
int n,k;
struct node
{
	__int64 a[10][10];
}res,origin;

void init()
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			res.a[i][j]=0;
			scanf("%I64d",&origin.a[i][j]);
			if(i==j)
				res.a[i][j]=1;
		}
	}
}


node Mitix(node aa,node bb)
{
	node temp;
	int i,j,t;
	memset(temp.a,0,sizeof(temp.a));
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			for(t=0;t<n;t++)
			{
				temp.a[i][j]=(temp.a[i][j]+aa.a[i][t]*bb.a[t][j])%mod;
			}
		}
	}
	return temp;
}

__int64 cal()
{
	int i;
	int m=k;
	while(m)
	{
		if(m&1)
			res=Mitix(res,origin);
		m=m>>1;
		origin=Mitix(origin,origin);
	}
	__int64 temp=0;
	for(i=0;i<n;i++)
	{
		temp=(temp+res.a[i][i])%mod;
	}
	return temp;
}


int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		scanf("%d%d",&n,&k);
		init();
		__int64 ans=cal();
		printf("%I64d\n",ans);
	}
	return 0;
}


 

你可能感兴趣的:(矩阵快速幂)