算法提高 递推求值
问题描述
已知递推公式:
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 &#