poj 3233 矩阵乘法(分块矩阵)

POJ 3233



题解:Sn为所求矩阵, 则


这样, 此题就变成了求矩阵幂和矩阵乘法, 分块矩阵乘法和普通矩阵一样的。



code:

/*
adrui's submission
Language : C++
Result : Accepted
Love : ll
Favorite : Dragon Balls

Standing in the Hall of Fame
*/


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
#include<bitset>
#include<map>
using namespace std;

#define M(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define ls rt << 1, l, mid
#define rs rt << 1|1, mid + 1, r
#define lowbit(x) (x & (-x))
#define LL long long
#define REP(n) for(int i = 0; i < n; i++)
#define debug 0
#define mod 1000

int n, k, m;

struct Matrix {
	int mat[65][65];														//分块矩阵原因, size要是2倍
	void init() {															//单位矩阵
		M(mat, 0);
		for (int i = 0; i < 65; i++)
			mat[i][i] = 1;
	}
	void output(int c) {
		for (int i = 0; i < c; i++) {
			for (int j = 0; j < c; j++)
			{
				printf("%d%s", mat[i][j] % m, j != c - 1 ? " " : "\n"); 
			}
		}
	}
};

Matrix operator * (Matrix a, Matrix b) {									//矩阵乘法
	Matrix c;	
	M(c.mat, 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++)
					c.mat[i][j] += (a.mat[i][k] * b.mat[k][j]) % m;
				c.mat[i][j] %= m;
			}
		}

	return c;
}

Matrix operator + (const Matrix &a, const Matrix &b) {						//矩阵加法
	Matrix c;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
			{
				c.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % m;
			}
		}
		//c.output();
	return c;
}

Matrix Matrix_fast_mod(Matrix tmp, int b) {									//快速矩阵幂
	Matrix res;
	res.init();																//单位矩阵
	while (b) {
		if (b & 1) res = tmp * res;
		tmp = tmp * tmp;
		b >>= 1;
	}
	return res;
}

int main() {
#if debug
	freopen("in.txt", "r", stdin);
#endif //debug
	
	while (~scanf("%d%d%d", &n, &k, &m)) {
		Matrix ans, b;
		M(b.mat, 0);
		Matrix res;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &res.mat[i][j]);
				res.mat[i][j] %= m;
				b.mat[i][j] = res.mat[i][j];								//b是幂底数矩阵
				res.mat[i][n + j] = res.mat[i][j];							//ret是包含Sn的分块矩阵
			}
			b.mat[n + i][i] = b.mat[n + i][n + i] = 1;
		}
		//b.output(2 * n);
		b = Matrix_fast_mod(b, k - 1);										//矩阵幂
		//b.output(2*n);
		//res.output(2 * n);
		ans = res * b;


		ans.output(n);										//输出
	}
	return 0;
}


POJ 3213题目通常涉及矩阵乘法,这是一个经典的算法问题,尤其是在计算机科学竞赛中常见的数学运算部分。矩阵乘法的本质是将两个矩阵相乘,结果是一个新的矩阵,其中每个元素是对应行和列元素的乘积之和。在Java中,解决这个问题通常会使用嵌套循环来计算每一个位置的值。 以下是解决该问题的一个基本思路和简单的Java代码示例: ```java import java.util.Scanner; public class MatrixMultiplication { static int[][] multiply(int[][] a, int[][] b) { int m = a.length; int n = a[0].length; int p = b[0].length; // 创建一个新的矩阵c,用于存储结果 int[][] c = new int[m][p]; for (int i = 0; i < m; i++) { // 遍历第一个矩阵的行 for (int j = 0; j < p; j++) { // 遍历第二个矩阵的列 for (int k = 0; k < n; k++) { // 遍历第一个矩阵的列,作为第二个矩阵的行索引 c[i][j] += a[i][k] * b[k][j]; // 计算并累加结果 } } } return c; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int rowsA = scanner.nextInt(); int colsB = scanner.nextInt(); int rowsB2 = scanner.nextInt(); int[][] matrixA = new int[rowsA][colsB]; int[][] matrixB = new int[rowsB][rowsB2]; // 读输入矩阵 for (int i = 0; i < rowsA; i++) { for (int j = 0; j < colsB; j++) { matrixA[i][j] = scanner.nextInt(); } } for (int i = 0; i < rowsB; i++) { for (int j = 0; j < rowsB2; j++) { matrixB[i][j] = scanner.nextInt(); } } int[][] result = multiply(matrixA, matrixB); // 打印结果矩阵 for (int[] row : result) { for (int num : row) { System.out.print(num + " "); } System.out.println(); } } } ``` 当你运行这个程序时,它会提示用户输入矩阵A的行数、矩阵B的列数以及矩阵B的大小,然后读矩阵的元素并计算它们的乘积。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值