计算序列 1,3,8,22,60,164,448,1224 的第 n 项
Calculate the nth term of the sequence 1,3,8,22,60,164,448,1224...?
可能的重复项:
我想按顺序 (1) 或 (nlogn) 生成序列 1,3,8,22,60 ,164 的第 n 项
我现在做的是:
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) 解决方案。
请只给我提示(请不要解决方案),以便我可以降低解决方案的复杂性。
您可以使用以下事实。如果您考虑矩阵
(0 1)
A = (2 2)
您可以使用n = 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 为止。
相关文章:
- 最高有效数字侧的第N位
- 在更改for循环的第三部分后,未使用for循环结果
- 删除列表中的第n个元素
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何使代码打印文本文件中的第一行?
- 在链表中的第 n 位插入显示分割错误
- 如何仅读取文本文件中的第一个值
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 数组中所有元素的最新最小元素的第五个位置
- 圣诞节的第N天,C++递归
- 查找连续子数组的第二小和
- 在C++中打印多个矢量的第一个值
- cin语句在循环的第三次迭代中被跳过
- 如何用CMake处理只有头的第三部分
- 如何在对数时间内访问 c++ std::set 中的第 k 个元素?
- Systemc - 将sc_time四舍五入到最接近的第 10 SC_NS
- 指向多维数组的第 n 个元素的指针
- 删除最小堆中的第 i 个索引
- 计算序列 1,3,8,22,60,164,448,1224 的第 n 项