c++ - 系列的第n项

标签 c++ algorithm series

我们必须找到这个系列的第 n 项 http://oeis.org/A028859

n<=1000000000

答案应该是模 1000000007

我已经写了代码,但是当n a 很大时,时间超过了限制。

#include<iostream>
using namespace std

int main()
{
    long long int n;
    cin>>n;

    long long int a,b,c;
    a=1;
    b=3;

    int i;
    for(i=3;i<=n;i++)
    {
        c=(2ll*(a+b))%1000000007;
        a=b;
        b=c; 
    }

    cout<<c;
}

最佳答案

解决此类问题的标准技术是将其重写为矩阵乘法,然后使用 exponentiation by squaring高效地计算矩阵的幂。

在这种情况下:

a(n+2) = 2 a(n+1) + 2 a(n)
a(n+1) = a(n+1)

(a(n+2)) = (2  2) * ( a(n+1) )
(a(n+1))   (1  0)   ( a(n)   )

所以如果我们定义矩阵 A=[2,2 ; 1,0],那么你可以通过

计算第 n 项
[1,0] * A^(n-2) * [3;1]

所有这些操作都可以以 1000000007 为模完成,因此不需要大数库。

它需要 O(log(n)) 2*2 矩阵乘法来计算 A^N,所以总的来说这个方法是 O(log(n)),而你原来的方法是 O(n)。

编辑

Here是一个很好的解释和此方法的 C++ 实现。

关于c++ - 系列的第n项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11285558/

相关文章:

algorithm - 值的恒定时间分级

c - 按升序和降序对列表进行排序

python - 更 Pythonic 的方式 - Pandas 数据帧操作

c++ - 无法定义依赖类型定义的成员

c++ - GCC/Clang 未优化静态全局变量

c++ - wWinmain、Unicode 和 Mingw

python - 根据关键字计算新列并拆分

c++ - 接口(interface)设计: safety of overloaded function taking string and char array

algorithm - 从成对数据中确定 parent 、子女

python - 如何高效地实现这种差分运算呢?