ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

51nod 1122 机器人走方格 V4(矩阵乘法)

2021-05-01 22:01:30  阅读:231  来源: 互联网

标签:位置 51nod 1122 机器人 矩阵 int V4 bmatrix


http://www.51nod.com/Challenge/Problem.html#problemId=1122

如果整体考虑4个机器人会感觉没有头绪,但是如果我们只单独考虑每一个每一个机器人的最终位置,即分别枚举4个机器人的终点(共4!种可能),这样4个机器人到对应终点处的方案数相乘就是答案。

如何求一个机器人从位置i走n步走到位置j的方案数?
a[i][j]=1表示从位置i走1步可以到达位置j
这个矩阵连乘n次,a[i][j]就是从位置i走n步走到位置j的方案数

在本题里,矩阵a为

\[ \begin{bmatrix} 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 0 & 1 & 1 & 1 \end{bmatrix} \]

#include<cstdio>
#include<cstring>

const int mod=1e9+7;

int a[5][5]=
{
0,0,0,0,0,
0,1,1,1,0,
0,1,1,0,1,
0,1,0,1,1,
0,0,1,1,1
};
int ans[5][5],c[5][5];

void mul(int a[5][5],int b[5][5])
{
	memset(c,0,sizeof(c));
	for(int i=1;i<=4;++i)
		for(int j=1;j<=4;++j)
			for(int k=1;k<=4;++k)
				c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j]%mod)%mod;
	for(int i=1;i<=4;++i)
		for(int j=1;j<=4;++j)
			a[i][j]=c[i][j];
}

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=4;++i) ans[i][i]=1;
	while(n)
	{
		if(n&1) mul(ans,a);
		mul(a,a);
		n>>=1;
	}
	int tot=0;
	for(int i=1;i<=4;++i)
		for(int j=1;j<=4;++j)
			for(int k=1;k<=4;++k)
				for(int l=1;l<=4;++l)
					if(i!=j && i!=k && i!=l && j!=k && j!=l && k!=l)
						tot=(tot+1ll*ans[1][i]%mod*ans[2][j]%mod*ans[3][k]%mod*ans[4][l]%mod)%mod;
	printf("%d",tot);		
}

标签:位置,51nod,1122,机器人,矩阵,int,V4,bmatrix
来源: https://www.cnblogs.com/TheRoadToTheGold/p/14724848.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有