已知斐波那契数列 Fn=Fn−1+Fn−2(n>=3),F1=1,F2=1 求解该数列的第n项,结果对998244353取模。 输入格式: 输入一个正整数n (1<=n<=10000000)。 输出格式: 输出一个数,数列的第n项c语言
时间: 2024-09-16 17:00:49 浏览: 101
要计算斐波那契数列的第n项,并将其结果对998244353取模,你可以使用矩阵快速幂算法。这个算法可以在多项式时间内解决大数乘法的问题,非常适合处理这种需要多次递推的情况。
以下是使用C语言实现的步骤:
```c
#include <stdio.h>
// 定义取模常数和矩阵乘法函数
const int MOD = 998244353;
long long fastPow(long long a, long long n) {
if (n == 0) return 1;
long long half = fastPow(a, n / 2);
long long res = (half * half) % MOD;
if (n % 2) res = (res * a) % MOD;
return res;
}
// 矩阵乘法的核心部分
void multiply(int F[2][2], int M[2][2]) {
int x = (F[0][0] * M[0][0] + F[0][1] * M[1][0]) % MOD;
int y = (F[0][0] * M[0][1] + F[0][1] * M[1][1]) % MOD;
int z = (F[1][0] * M[0][0] + F[1][1] * M[1][0]) % MOD;
int w = (F[1][0] * M[0][1] + F[1][1] * M[1][1]) % MOD;
F[0][0] = x; F[0][1] = y;
F[1][0] = z; F[1][1] = w;
}
// 计算斐波那契数列的第n项
int fibonacci(int n) {
// 初始化基础矩阵
static const int matrix[2][2] = { {1, 1}, {1, 0} };
if (n <= 1) return n;
// 使用矩阵快速幂
int result[2][2] = {{1, 0}, {0, 1}};
while (n > 0) {
if (n & 1) multiply(result, matrix);
multiply(matrix, matrix);
n >>= 1;
}
return result[0][0]; // 返回斐波那契数列的第n项
}
int main() {
int n;
scanf("%d", &n);
printf("%lld\n", fibonacci(n));
return 0;
}
```
在这个程序中,我们首先初始化了一个2x2的基础矩阵,然后通过不断平方并根据n的二进制位进行调整,利用矩阵乘法逐步计算出第n项。最后返回的结果就是斐波那契数列的第n项对998244353取模后的值。
阅读全文