题解 | #递推数列#

递推数列

https://www.nowcoder.com/practice/d0e751eac618463bb6ac447369e4aa25

利用矩阵来求解递推关系问题 矩阵法+快速幂
#include<iostream>
using namespace std;

void MatrixMultiply(int m1[2][2], int m2[2][2], int res[2][2]) {  //实现矩阵的乘法
	res[0][0] = m1[0][0] * m2[0][0]%10000 + m1[0][1] * m2[1][0] % 10000;
	res[0][0] %= 10000;
	res[0][1] = m1[0][0] * m2[0][1]%10000 + m1[0][1] * m2[1][1] % 10000;
	res[0][1] %= 10000;
	res[1][0] = m1[1][0] * m2[0][0]%10000 + m1[1][1] * m2[1][0] % 10000;
	res[1][0] %= 10000;
	res[1][1] = m1[1][0] * m2[0][1]%10000 + m1[1][1] * m2[1][1] % 10000;
	res[1][1] %= 10000;
}

void MatrixPower(int m1[2][2], int n, int res[2][2]) {
	if (n == 0)
	{
		res[0][0] = 1;
		res[0][1] = 0;
		res[1][0] = 0;
		res[1][1] = 1;
	}
	else if (n % 2 == 0) {
		int temp[2][2];
		MatrixPower(m1, n / 2, temp);
		MatrixMultiply(temp, temp, res);
	}
	else {
		int temp1[2][2];
		MatrixPower(m1, n / 2, temp1);
		int temp2[2][2];
		MatrixMultiply(temp1, temp1, temp2);
		MatrixMultiply(temp2, m1, res);
	}

}

int main() {
	int matrix[2][2];
	matrix[1][0] = 1;
	matrix[1][1] = 0;
	int a0, a1, p, q, k;
	cin >> a0 >> a1 >> p >> q >> k;
	matrix[0][0] = p;
	matrix[0][1] = q;
	int res[2][2];
	MatrixPower(matrix, k - 1, res);
	cout << (res[0][0] * a1 % 10000 + res[0][1] * a0 % 10000) % 10000;

	return 0;

}

全部评论

相关推荐

手撕没做出来是不是一定挂
Chrispp3:不会,写出来也不一定过
点赞 评论 收藏
分享
11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务