我需要这道题的C++代码:已知斐波那契数列 F n =F n−1 +F n−2 (n>=3),F 1 =1,F 2 =1 求解该数列的第n项,结果对998244353取模。 提示:矩阵快速幂,unsigned long long的最大值:1844674407370955161(1.8e18) 输入格式: 输入一个正整数n (1<=n<=1e18)。 输出格式: 输出一个数,数列的第n项
时间: 2023-06-23 10:08:58 浏览: 192
以下是使用矩阵快速幂计算斐波那契数列第n项的C++代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int MOD = 998244353;
// 定义矩阵乘法
vector<vector<long long>> matrixMultiply(vector<vector<long long>>& a, vector<vector<long long>>& b) {
int n = a.size(), m = b[0].size(), p = b.size();
vector<vector<long long>> c(n, vector<long long>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int k = 0; k < p; k++) {
c[i][j] += (a[i][k] * b[k][j]) % MOD;
c[i][j] %= MOD;
}
}
}
return c;
}
// 定义矩阵快速幂
vector<vector<long long>> matrixFastPow(vector<vector<long long>>& a, long long b) {
int n = a.size();
vector<vector<long long>> res(n, vector<long long>(n));
for (int i = 0; i < n; i++) {
res[i][i] = 1;
}
while (b) {
if (b & 1) {
res = matrixMultiply(res, a);
}
a = matrixMultiply(a, a);
b >>= 1;
}
return res;
}
int main() {
long long n;
cin >> n;
if (n == 1 || n == 2) {
cout << 1 << endl;
return 0;
}
// 定义矩阵
vector<vector<long long>> mat = {{1, 1}, {1, 0}};
// 计算矩阵快速幂mat^(n-2)
mat = matrixFastPow(mat, n-2);
// 计算斐波那契数列第n项
long long ans = (mat[0][0] + mat[0][1]) % MOD;
cout << ans << endl;
return 0;
}
```
时间复杂度为O(logn)。
阅读全文