信息学奥赛一本通c++观察以下数据的规律 1 1 2 3 5 8 13 21 34 55..... 接下来有q次查询,每次查询都会输入一个正整数X,请输出这个序列的第X项的值,由于数据很大,只需输出对1000000003取模的值即可。
时间: 2025-03-12 09:18:18 浏览: 32
### 高效计算斐波那契数列第N项并取模
对于高效计算斐波那契数列的第N项并且对大数取模的操作,在信息学竞赛中是一个常见的题目。考虑到直接递归效率低下,可以采用矩阵快速幂方法来优化时间复杂度到O(log N),这使得处理非常大的`n`成为可能。
#### 使用矩阵快速幂求解斐波那契数列
斐波那契数列可以通过下面的状态转移方程表示:
\[ \begin{bmatrix} F(n) \\ F(n-1) \end{bmatrix} = M^{(n-1)} * \begin{bmatrix} 1 \\ 0 \end{bmatrix},\quad 其中M=\begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix} \]
为了防止数值溢出,每次运算的结果都需要对给定的大素数\(p=1,000,000,007\)取余操作[^2]。
下面是具体的C++代码实现方式:
```cpp
#include <iostream>
using namespace std;
const int MOD = 1e9 + 7;
struct Matrix {
long long mat[2][2];
};
Matrix matrixMultiply(const Matrix& a, const Matrix& b){
Matrix ret{};
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
for(int k = 0;k<2;++k)
ret.mat[i][j]=(ret.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD;
return ret;
}
// 计算矩阵A的n次幂
Matrix fastPower(Matrix A, int n){
Matrix res{}, base=A;
res.mat[0][0]=res.mat[1][1]=1;
while(n>0){
if(n&1) res=matrixMultiply(res,base);
base=matrixMultiply(base,base);
n>>=1;
}
return res;
}
long long fibMod(long long n){
if(n==0)return 0;
Matrix m={{1,1},{1,0}};
Matrix ans=fastPower(m,n-1);
return ans.mat[0][0]%MOD;
}
```
此段程序通过定义了一个辅助结构体`Matrix`用于存储二阶方阵,并实现了两个主要功能函数——`matrixMultiply()`负责两矩阵相乘后的结果仍保持在模意义下;而`fastPower()`则利用分治的思想加速了指数级别的连乘过程。最后由入口函数`fibMod()`调用来获得最终答案[^4]。
阅读全文