首页 > 其他 > 详细

Power of Matrix UVA - 11149

时间:2021-06-08 20:09:36      阅读:13      评论:0      收藏:0      [点我收藏+]

原题链接
考察:矩阵快速幂
两种方法,但我都没想到()
思路一:

\[ \left[ \begin{matrix} A & E \ 0 & E \ \end{matrix} \right]* \left[ \begin{matrix} A & E \ 0 & E \ \end{matrix} \right] = \left[ \begin{matrix} A^2 & A+E \ 0 & E \ \end{matrix} \right] \]

??显然(1,1)+(1,2)-(2,2)就是答案.

Code

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 40,M =80,Mod = 10;
int A[N][N],a[M][M],b[M][M],n,k;
void mul(int a[][M],int b[][M])
{
	int res[M][M] = {0};
	for(int i=0;i<2*n;i++)
	  for(int j=0;j<2*n;j++)
	    for(int k=0;k<2*n;k++)
	      res[i][j] = (res[i][j]+(LL)a[i][k]*b[k][j])%Mod;
	memcpy(a,res,sizeof res);
}
void solve()
{
	for(int i=0;i<n;i++)
	  for(int j=0;j<n;j++)
	    printf("%d%c",(a[i][j]+a[i][j+n]-a[i+n][j+n])%Mod,j==n-1?‘\n‘:‘ ‘);
}
int main()
{
	int kcase = 0;
    while(scanf("%d%d",&n,&k)!=EOF&&(n+k))
	{
		memset(a,0,sizeof a);
		if(kcase) printf("\n");
		kcase++;
		for(int i=0;i<n;i++)
		  for(int j=0;j<n;j++)
		  {
		  	scanf("%d",&A[i][j]);
		  	a[i][j] = A[i][j];
		  	if(i==j) a[i][j+n] = 1,a[i+n][j+n] = 1;
		  }
		if(k==1)
		{
			for(int i=0;i<n;i++)
			  for(int j=0;j<n;j++)
			    printf("%d%c",A[i][j]%Mod,j==n-1?‘\n‘:‘ ‘);
			continue;
		} 
		memcpy(b,a,sizeof a); 
		k--;
		while(k)
		{
			if(k&1) mul(a,b);
			mul(b,b);
			k>>=1;
		}
		solve();
	}
	return 0; 
}

??思路二就是利用递归和分治了,具体看抽风大佬的题解吧,我懒得写了,这种写法适用于结构体,数组比较麻烦,主要是结构体进行运算实际就是声明了一个新的结构体接收,然后以前的值不改变(.

Go

Power of Matrix UVA - 11149

原文:https://www.cnblogs.com/newblg/p/14863943.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!