算法提高 递推求值 【矩阵快速幂】

算法提高 递推求值

问题描述
  已知递推公式:

F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,

F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.

初始值为:F(1, 1)=2, F(1, 2)=3, F(2, 1)=1, F(2, 2)=4, F(3, 1)=6, F(3, 2)=5。
  输入n,输出F(n, 1)和F(n, 2),由于答案可能很大,你只需要输出答案除以99999999的余数。
输入格式
  输入第一行包含一个整数n。
输出格式
  输出两行,第一行为F(n, 1)除以99999999的余数,第二行为F(n, 2)除以99999999的余数。
样例输入
4
样例输出
14
21
数据规模和约定
  1<=n<=10^18。<——19位int上限,变量n定义为long long

不是矩阵快速幂的首稿一定超时 20 看小编的朴素算法

#include<iostream>
using namespace std;
const int mod = 99999999;
int F(int n,int i)
{
   
	if (n == 1 && i == 1)return 2;
	if (n == 1 && i == 2)return 3;
	if (n == 2 && i == 1)return 1;
	if (n == 2 && i == 2)return 4;
	if (n == 3 && i == 1)return 6;
	if (n == 3 && i == 2)return 5;
	if (i == 1)
		return F(n - 1, 2)%mod + 2*F(n - 3, 1)%mod + 5%mod;
	else
		return F(n - 1, 1)%mod + 3*F(n - 3, 1) %mod+ 2*F(n - 3, 2) %mod+ 3%mod;
}
int main()
{
   
	int n;
	cin >> n;
	cout << F(n, 1) << endl;
	cout << F(n, 2) << endl;
	return 0;
}

思路:矩阵快速幂 学习博客VeggieOrz推理图解
代码如下:7×7版本 小编自打 100

#include<iostream>
using namespace std;
const int mod = 99999999;
struct Matrix//结构体 矩阵类型
{
   
	long long m[7][7];
}ans, res,ans1;
/*计算矩阵乘法的函数*/
Matrix Mul(Matrix A, Matrix B)
{
   
	Matrix temp;//定义一个临时的矩阵,存放A*B的结果
	for (int i = 0; i <7; i++)
	{
   
		for (int j &#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值