【问题标题】:Calculate the nth term of the sequence 1,3,8,22,60,164,448,1224...? [duplicate]计算序列1,3,8,22,60,164,448,1224...的第n项? [复制]
【发布时间】:2012-07-03 10:04:22
【问题描述】:

可能重复:
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) 的解决方案。

请只给我提示(请不要解决),以便我可以降低解决方案的复杂性。

【问题讨论】:

  • 这里有一个提示:不要将旧结果存储在数组中,这样a 就可以成为寄存器变量。
  • t_n 和 t_(n-1) 之间的循环关系是什么? t_n = 2 * (t_(n-1) + t_(n-2)) ?尝试使用特征方程求解这个递归方程。

标签: c++ algorithm math sequence


【解决方案1】:

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

    (0 1)
A = (2 2)

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

【讨论】:

【解决方案2】:

您根本不需要数组来实现这一点。

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 之前,它们都不是全部。

【讨论】:

  • 仍然是 O(n) 时间解决方案...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多