P2626 斐波那契数列(升级版), 题解:

P2626 斐波那契数列(升级版):https://www.luogu.com.cn/problem/P2626

题目要求求出第 n 个斐波那契数列的数,计算其对 2^31 取余后,再对结果进行质因数分解。

步骤

  1. 计算斐波那契数:通过递推公式计算第 n 个斐波那契数。
  2. 模运算:计算 f(n) % (2^31)
  3. 质因数分解:对计算结果进行质因数分解。

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;
}

解释

  1. fibonacci(int n):用迭代的方法计算第 n 个斐波那契数,模 2^31,避免数值溢出。
  2. prime_factorization(long long x):对输入 x 进行质因数分解。如果某个质因数多次出现,按要求打印其个数。
  3. 主函数:从输入中读取 n,计算第 n 个斐波那契数,然后输出其质因数分解。

示例输入与输出

输入:

5

输出:

5=5

输入:

6

输出:

8=2*2*2

复杂度

  • 时间复杂度

    • 计算斐波那契数的复杂度为 O(n),由于我们在计算时使用了模运算,避免了数值溢出。
    • 质因数分解的复杂度为 O(sqrt(x)),其中 x 是斐波那契数的值,通常斐波那契数的大小增长得比较快。
posted @ 2025-07-11 07:22  kkman2000  阅读(33)  评论(0)    收藏  举报