ICode9

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

【矩阵乘法】矩阵求和

2021-11-27 16:31:11  阅读:191  来源: 互联网

标签:求和 单位矩阵 ll 矩阵 int Ans include 乘法


小目录

链接

YbtOJ 6-1-4

题目描述

给出一个nn的矩阵和一个正整数k ,求S = A * A^2 * A ^ 3… A^k 。矩阵中的每个数对 取模。

思路

构建一个矩阵B,左上放一个矩阵A,右上放一个大小相同的单位矩阵,右下也放一个同样大小的单位矩阵,然后直接跑快速幂就好了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long

using namespace std;

ll n, m, tk;

struct matrix
{
	ll n, m;
	ll a[105][105];
}A, B, Ans;

void pre()
{
	for(int i = 1; i <= 2 * n; ++i)
		Ans.a[i][i] = 1;
	B.n = B.m = Ans.n = Ans.m = n * 2;
}

matrix operator *(matrix a, matrix b)
{
	matrix c;
	c.n = a.n;
	c.m = b.m;
	memset(c.a, 0, sizeof(c.a));
	for(int k = 1; k <= a.m; ++k)
	for(int i = 1; i <= c.n; ++i)
	for(int j = 1; j <= c.m; ++j)
		c.a[i][j] = (c.a[i][j] + (a.a[i][k] * b.a[k][j]) % m) % m;
	return c;
}

void quick_pow(ll t)
{
	while(t)
	{
		if(t & 1) Ans = Ans * B;
		B = B * B;
		t >>= 1;
	}
}

int main()
{
	scanf("%lld%lld%lld", &n, &tk, &m);
	pre();
	for(int i = 1; i <= n; ++i)
	for(int j = 1; j <= n; ++j)
		scanf("%lld", &A.a[i][j]);
		
	for(int i = 1; i <= n; ++i)
	for(int j = 1; j <= n; ++j)
		B.a[i][j] = A.a[i][j];
	for(int i = 1; i <= n; ++i)
	for(int j = n + 1; j <= 2 * n; ++j)
		if(i == j - n) B.a[i][j] = 1;
	for(int i = n + 1; i <= 2 * n; ++i)
	for(int j = 1; j <= n; ++j)
		B.a[i][j] = 0;
	for(int i = n + 1; i <= 2 * n; ++i)
	for(int j = n + 1; j <= 2 * n; ++j)
		if(i == j) B.a[i][j] = 1;
		
	quick_pow(tk + 1);
	for(int i = 1; i <= n; ++i) {
		for(int j = n + 1; j <= 2 * n; ++j)
			if(i == j - n) printf("%lld ", (Ans.a[i][j] - 1) % m);//要把原来的单位矩阵删掉
				else printf("%lld ", Ans.a[i][j] % m);
		printf("\n");
	}
	return 0;
} 

标签:求和,单位矩阵,ll,矩阵,int,Ans,include,乘法
来源: https://blog.csdn.net/LTH060226/article/details/121579009

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

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

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

ICode9版权所有