计算序列的第n项1,3,8,22,60,164,448,1224 ...?

时间:2012-07-03 10:04:22

标签: c++ algorithm math sequence

  

可能重复:
  I want to generate the nth term of the sequence 1,3,8,22,60 ,164 in Order(1) or order of (nlogn)

我现在所做的是:

t1 = 1, t2 = 0,MOD = 1000000007;

for i = 1:n 

    t1_new = (2*(t1+t2)) % MOD;
    t2_new = t1;
    a[i] = (t1_new + t2_new) % MOD;   // where a[i] is the ith term mod p
    t1 = t1_new;
    t2 = t2_new;

return a[n]; // the required ans

但这是一个O(n)解决方案。

请给我一些提示(请不要提供解决方案),这样我就可以降低解决方案的复杂性。

2 个答案:

答案 0 :(得分:2)

您可以使用以下事实。如果你考虑矩阵

    (0 1)
A = (2 2)

你可以使用 n = A n-2 *(1,3)[1](这里(1,3)是一个向量)的事实[1]表示向量的第二个坐标。在这里,您可以对矩阵使用二进制求幂。分别考虑n <= 2的情况。

答案 1 :(得分:-1)

根本不需要数组来实现这一目标。

int n = 5;
int result = 0;

for (int i=0; i<n; ++i)
{
    int t1_new = (2*(t1+t2)) % MOD;
    int t2_new = t1;

    result = (t1_new + t2_new) % MOD;
    t1 = t1_new;
    t2 = t2_new;
}

int res = result;

这样,你将得到第n个词,而不是所有词,直到n。