【发布时间】:2015-01-10 00:12:22
【问题描述】:
简单的 RecurrenceMax。 0分
我们的英雄 - 亚历克斯已经研究了一周。而且他有 最近得到了一个递归关系来解决其中的一部分 研究。但他没有时间。你能做到吗?
递归关系如下:f(n) = 3 * f(n-1) + 2 * f(n-2) + 2 * g(n-1)+3 * g(n-2) , g(n) = g(n-1) + 2 * g(n-2)。
给定 f(1), f(0), g(1), g(0) 的初始值。
你必须输出 f(N) mod 10^9。
输入:
在第一行给你 4 个数字:f(1), f(0), g(1), g(0) 分别。在下一行,你会得到一个整数 N。
输出:
输出 f(N) mod 10^9。
约束:
1
示例输入(明文链接)
1 1 1 1 4 示例输出(明文链接) 162
这确实是一个非常简单的问题。我只是使用 6 个变量 f0、f1、f2、g0、g1、g2 的迭代来解决它。在循环中,我首先计算 g2,f2,然后 f0=f1,f1=f2,g0=g1,g1=g2。 c++ 中的数据类型是 unsigned long long。
但是,时间限制是 1 秒,我得到 1.06 秒。因此我在测试中只通过了一个测试用例,其他的“超出时间限制”。有没有更快的解决方法?
我的代码是:
#include<iostream>
using namespace sdt;
int main()
{
unsigned long long f0, f1, g0, g1, f2, g2;
unsigned long long N;
cin>>f1>>f0>>g1>>g0;
cin>>N;
for(unsigned long long i=2; i<N+1; i++)
{
f2=3*f1+2*f0+2*g1*3*g0;
g2=g1+2*g0;
f0=f1;
f1=f2;
g0=g1;
g1=g2;
}
unsigned long long result=f2%1000000000;
cout<<result;
return 0;
}
【问题讨论】:
-
Is there any faster way to solve it?是的,忘记递归方程。做一些手动计算得到一个线性的。 -
如果您发布代码,您将更有可能获得帮助。
-
您好,我已经添加了我的代码,感谢您的提醒
-
此代码没有为示例输入提供正确的结果
标签: c++ algorithm recurrence