当前位置:首页 > GESP > 2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

4周前 (06-19)

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现 GESP五级 质因数分解  算法优化 第1张

一、题目解读

2023年GESP五级题「因式分解」(洛谷B3871)要求将给定的大整数N分解为质因数的乘积形式,并输出每个质因数及其指数。题目考察核心算法质因数分解,需高效处理大数分解,避免超时。难点在于如何优化分解过程,减少循环次数,同时准确记录每个质因数的出现次数。

二、解题思路

用户提供的代码采用试除法进行质因数分解,核心逻辑分为三步:

1. 优先处理2因子:由于2是唯一的偶质数,单独处理可减少后续循环次数。通过循环除以2,统计其出现次数。

2. 处理奇数因子:从3开始,以步长2遍历奇数(跳过偶数),利用sqrt(n)优化上限,减少遍历范围。

3. 处理剩余大质数:若分解后n仍大于1,说明剩余部分为大于sqrt(n)的质数,直接作为单个因子加入结果。

该思路通过分阶段处理,结合数学优化(如sqrt减少遍历范围),实现高效分解。

三、解题步骤

1. 输入:读取用户输入的整数N。

2. 质因数分解:调用factorize(N)函数,利用试除法分解N,结果存入vector<pair<long long, int>>(质因数+指数)。

3. 输出结果:遍历结果vector,拼接质因数表达式(如2^3 * 3^2)。

4. 边界处理:若N为质数或剩余大质数,单独处理其指数为1的情况。

四、代码与注释

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

// 质因数分解函数
vector<pair<long long, int>> factorize(long long n) {
    vector<pair<long long, int>> factors;
    
    // 处理2的因子
    if (n % 2 == 0) { // 优先处理2,减少后续循环次数
        int cnt = 0;
        while (n % 2 == 0) {
            n /= 2;
            cnt++; // 统计2的个数
        }
        factors.emplace_back(2, cnt); // 添加至结果
    }
    
    // 处理奇数因子
    for (long long i = 3; i <= sqrt(n); i += 2) { // 仅遍历奇数,优化范围
        if (n % i == 0) {
            int cnt = 0;
            while (n % i == 0) {
                n /= i;
                cnt++;
            }
            factors.emplace_back(i, cnt); // 添加质因数及其指数
        }
    }
    
    // 处理剩余的大质数(若n仍未1,说明其为大于sqrt(n)的质数)
    if (n > 1) {
        factors.emplace_back(n, 1);
    }
    
    return factors;
}

int main() {
    long long N;
    cin >> N;
    
    auto factors = factorize(N);
    bool first = true;
    
    // 输出格式:质因数^指数,用*分隔
    for (const auto& [prime, exp] : factors) {
        if (!first) {
            cout << " * ";
        }
        first = false;
        
        cout << prime;
        if (exp > 1) {
            cout << "^" << exp;
        }
    }
    
    cout << endl;
    return 0;
}

五、总结

1. 算法效率:通过优先处理2因子、奇数遍历步长2、sqrt优化上限,该代码在时间复杂度上远优于暴力枚举,适用于大数分解场景。

2. 代码优化点:

    使用vector动态存储因子,避免固定数组长度限制。

    利用C++11的结构化绑定([prime, exp])简化迭代输出。

3. 扩展思考:对于更复杂的大数分解问题,可结合筛法(如埃氏筛)预处理质数表,进一步提升效率。

该题目解法不仅是GESP竞赛的典型考点,也为学习数学与编程结合的算法思维提供了优秀案例。



原创内容 转载请注明出处

分享给朋友:

相关文章

2024 GESP五级「奇妙数字」深度解析:高效解题代码与数学逻辑揭秘(洛谷B4070)

2024 GESP五级「奇妙数字」深度解析:高效解题代码与数学逻辑揭秘(洛谷B4070)

一、题目解读2024年GESP(青少年编程能力等级测试)五级题目「奇妙数字」(对应洛谷平台题目B4070),要求选手根据特定规则计算输入数字的“奇妙值”。题目核心在于挖掘数字的数学特性,结合质因数分解...

力扣2771题解析:双数组动态规划求解最长非递减子数组问题

力扣2771题解析:双数组动态规划求解最长非递减子数组问题

一、题目解读力扣2771题要求从两个整数数组nums1和nums2中合并元素,寻找最长非递减子数组的长度。非递减子数组指元素单调递增或相等的连续序列。题目难点在于需同时考虑两个数组的交互关系,找到全局...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

NOI 2001密码锁(洛谷P2024)解题全解析:并查集+关系标记算法实战

NOI 2001密码锁(洛谷P2024)解题全解析:并查集+关系标记算法实战

一、题目解读2001年NOI密码锁(洛谷P2024)是一个经典的逻辑判断问题。题目描述了一个动物园中动物之间的关系,需要处理两种类型的陈述:同类关系(1)和捕食关系(2)。要求根据给定的K条关系,判断...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。