【问题标题】:Simple recurrence in C++C++中的简单递归
【发布时间】: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


【解决方案1】:

给定的递归可以写成

使用f(1)f(o)g(1)g(0) 给出的基本条件。现在,要计算f(n),我们必须将系数矩阵提高到n - 1 的幂。幸运的是,这可以使用log(n) 矩阵乘法来完成。这是exponentiation的著名问题。

由于矩阵很小,这具有O(log(n)) 的复杂性。

【讨论】:

    【解决方案2】:

    1-代码与递归关系不同。代码应该是:

    f2=3*f1+2*f0+2*g1+3*g0;
    

    2-优化代码的一种可能方法是减少繁重计算的数量,在这种情况下是乘法,通过这样做:

    f2=3*(f1+g0)+2*(f0+g1);
    

    但是,我认为编译器的优化器会自动为您执行此操作,但您可以自己尝试确定。

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多