P2626 斐波那契数列(升级版), 题解:
P2626 斐波那契数列(升级版):https://www.luogu.com.cn/problem/P2626
题目要求求出第 n 个斐波那契数列的数,计算其对 2^31 取余后,再对结果进行质因数分解。
步骤
- 计算斐波那契数:通过递推公式计算第
n个斐波那契数。 - 模运算:计算
f(n) % (2^31)。 - 质因数分解:对计算结果进行质因数分解。
C++代码实现
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
// 计算第n个斐波那契数
long long fibonacci(int n) {
if (n == 1 || n == 2) return 1;
long long a = 1, b = 1;
for (int i = 3; i <= n; ++i) {
long long temp = (a + b) % (1LL << 31); // 2^31
a = b;
b = temp;
}
return b;
}
// 质因数分解
void prime_factorization(long long x) {
bool first = true;
for (long long i = 2; i * i <= x; ++i) {
while (x % i == 0) {
if (first) {
cout << x << "=";
first = false;
} else {
cout << "*";
}
cout << i;
x /= i;
}
}
if (x > 1) {
if (first) {
cout << x << "=";
} else {
cout << "*";
}
cout << x;
}
cout << endl;
}
int main() {
int n;
cin >> n;
// 计算第n个斐波那契数 mod 2^31
long long fib = fibonacci(n);
// 输出质因数分解
prime_factorization(fib);
return 0;
}
解释
fibonacci(int n):用迭代的方法计算第n个斐波那契数,模2^31,避免数值溢出。prime_factorization(long long x):对输入x进行质因数分解。如果某个质因数多次出现,按要求打印其个数。- 主函数:从输入中读取
n,计算第n个斐波那契数,然后输出其质因数分解。
示例输入与输出
输入:
5
输出:
5=5
输入:
6
输出:
8=2*2*2
复杂度
-
时间复杂度:
- 计算斐波那契数的复杂度为
O(n),由于我们在计算时使用了模运算,避免了数值溢出。 - 质因数分解的复杂度为
O(sqrt(x)),其中x是斐波那契数的值,通常斐波那契数的大小增长得比较快。
- 计算斐波那契数的复杂度为

浙公网安备 33010602011771号