北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展

基本思想:

快速幂的拓展,把快速幂乘法的指数部分改成矩阵即可;

关键点:

无;

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;

const int maxn = 15;
int n, k;

vector<vector<int>> multi(vector<vector<int>>m1, vector<vector<int>>m2) {
	vector<vector<int>> m3;
	m3.resize(n);
	for (int i = 0; i < n; i++) {
		m3[i].resize(n);
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < n; k++) {
				m3[i][j] += m1[i][k] * m2[k][j];
			}
		}
	}
	return m3;
}

vector<vector<int>> quckmatrix(vector<vector<int>> m) {
	vector<vector<int>> ans=m;
	vector<vector<int>> res;
	res.resize(n);
	for (int i = 0; i < n; i++) {
		res[i].resize(n);
	}
	for (int i = 0; i < n; i++) {
		//单位矩阵
		res[i][i] = 1;
	}
	while (k > 0) {
		//对k二进制进行操作;
		if (k % 2 == 1) {
			res = multi(res, ans);
		}
		k /= 2;
		ans = multi(ans, ans);
	}
	return res;
}

int main() {
	while (cin >> n >> k) {
		vector<vector<int>> ma;
		ma.resize(n);
		for (int i = 0; i < n; i++) {
			ma[i].resize(n);
		}
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < n; k++) {
				cin >> ma[j][k];
			}
		}
		ma = quckmatrix(ma);
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (j == 0)
					cout << ma[i][j];
				else
					cout << " " << ma[i][j];
			}
			cout << endl;
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/songlinxuan/p/12425832.html

时间: 2024-10-29 15:16:11

北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展的相关文章

数论——快速幂,模运算及快速幂求逆元

一.快速幂 原理: 快速幂的原理十分简单. ak=a2^0*a2^1*a2^2*…a2^x,其中k=20+21+22+…+2x. 这显然是正确的.因为任何一个数都可以表示成二进制. 接下去利用位运算实现即可. 代码实现 模板题链接:快速幂 代码模板如下:时间复杂度O(logk) int qmi(int a,int k,int p) { int res=1%p; while(k) { if(k&1)res=(long long)res*a%p; a=(long long)a*a%p; k>&g

【bzoj2242】[SDOI2011]计算器 数论相关(快速幂+扩展欧几里得+BSGS)

2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2529 Solved: 1003 [Submit][Status][Discuss] Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. In

hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Holion August will eat every thing he has found. Now there are many foods,but he does not want to eat all of them at once,so he fi

51Nod - 1013 - 3的幂的和(分治、快速幂)

题目链接 ??大致看了一下,网上的题解大多数是用的逆元做的,今天受lyd蓝书的启发,发现用分治也可以做这个. ??首先,我们设\(F(n) = 3^0 + 3^1 + 3^2 + ... + 3^n\). ??1.如果n为奇数,那么\(F(n) = (3^0 + 3^1 + 3^2 ... + 3^{\frac{n-1}{2}}) + (3^{\frac{n+1}{2}} + ... + 3^n)\). 进一步可得:\(F(n) = (3^0 + 3^1 + 3^2 ... + 3^{\frac

九度OJ&amp;北邮机试题(2011网院)

题目一.九度OJ-1177:查找 http://ac.jobdu.com/problem.php?pid=1177 题目描述: 读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1.翻转  从下标为i的字符开始到i+len-1之间的字符串倒序:2.替换  命中如果第一位为1,用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串.每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上). 命令格式:第一

华为机试-矩阵乘法

题目描述如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C.这个矩阵的每个元素是由下面的公式决定的: 原型:voidmatrix_multiply(int *m1,int *m2,int *r, int x, int y, int z);输入参数: int *m1:x行y列的矩阵(array1[x][y]) int *m2:y行z列的矩阵(array2[y][z]) int x:矩阵m1的行数 int y:矩阵m1的列数/矩阵m2的行数 int z:矩

九度OJ&amp;北邮机试题题解(北邮2010网院)

题目一.九度OJ-1173:查找(水题随便搞) ac.jobdu.com/problem.php?pid=1173 题目描述: 输入数组长度 n 输入数组      a[1...n] 输入查找个数m 输入查找数字b[1...m] 输出 YES or NO  查找有则YES 否则NO . 输入: 输入有多组数据. 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100). 输出: 如果在n个数组中输出YES否则输出NO. 样例输入: 5 1 5 2 4 3 3

九度OJ&amp;北邮机试题(2010计算机)

题目一.九度OJ-1169:比较奇偶数个数 http://ac.jobdu.com/problem.php?pid=1169 题目描述: 第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000). 输出: 如果偶数比奇数多,输出NO,否则输出YES. 样例输入: 5 1 5 2 4 3 样例输出: YES 直接来代码: AC代码: /** *@xiaoran */ #inc

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有