题解 | #递推数列#

递推数列

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;

}

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
与火:这不接? 留子的钱不挣白不挣
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务