系列的第 n 项
nth term of series
本文关键字:系列 更新时间:2023-10-16
我们必须找到这个系列的第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;
}
解决此类问题的标准技术是将其重写为矩阵乘法,然后通过平方使用幂来有效地计算矩阵的幂。
在这种情况下:
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)。
编辑
这是此方法的一个很好的解释和C++实现。
当long long
不够时,您可能想使用 bignum 库。例如 GNU MP。
相关文章:
- 从 c 或 cpp 系列子函数返回到主函数
- 在 Vulkan Qt 中获取队列系列
- QChart在使用QDateTimeAxis时不显示任何系列数据
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- 打印系列时循环出现问题
- 有关如何处理 vulkan 队列系列的问题
- Vulkan --- vkAcquireNextImageKHR 在使用某些队列系列时抛出 std::out_of_ra
- 对于非常大的输入,缺少和重复 1..n 的数字数组.使用1..n系列特性的解决方案.溢出问题
- 不同平台的 fstream 系列实现是否不同?
- 统一位置和属性位置 - 是相同的数字系列吗?
- 协议不支持 C++ 地址系列
- Win32 C API:替代损坏的execl*()系列函数?
- C 总和系列阶乘
- 在C 的COUT系列中创建一个空间
- 查找系列中最大的产品
- 无法使用VTK (vtkDICOMImageReader)识别切片ID/系列ID
- 创建可相互转换的模板类系列
- 生成从 1 到 1000 的卡拉奇特系列的程序,其中包括数字和字母
- 断开连接时Arduino系列读取
- Clang&GCC以不同的方式诠释系列演员表