当前位置:首页 > 洛谷 > 洛谷P1593题解:质因数分解与快速幂优化求解

洛谷P1593题解:质因数分解与快速幂优化求解

4个月前 (07-27)

洛谷P1593题解:质因数分解与快速幂优化求解 洛谷题解 质因数分解 快速幂算法 等比数列 取模运算 递归 第1张

一、题目解读

洛谷P1593题是一道涉及数学推导算法优化的题目,要求计算给定整数a的b次方各质因数的乘积,并对结果取模9901。题目核心在于将指数运算转化为质因数分解,结合等比数列求和公式求解,需兼顾时间复杂度与高精度计算

二、解题思路

通过以下思路解题:

1. 质因数分解:将a分解为质因数乘积形式(如a = p1^c1 * p2^c2 *...),每个质因数pi的指数为ci。

2. 转化数学公式:将a^b分解为各质因数pi的b次方乘积,即求Σ(p_i^b)。

3. 等比数列求和:每个质因数的贡献可转化为等比数列求和公式(1 + p + p^2 +... + p^(c*b)),利用递归分治优化计算复杂度。

4. 快速幂优化:为避免大数溢出,使用快速幂算法计算幂次结果并取模。

三、解题步骤

1. 输入处理:读取a和b,若a=0直接返回0。

2. 质因数分解:从2开始遍历至√a,统计每个质因数i的出现次数cnt。

3. 递归计算:调用sum函数计算每个质因数i的等比数列和sum(i, cnt*b),乘积累乘至res。

4. 特殊处理:若分解后a仍大于1(剩余大质因数),单独计算其贡献。

5. 结果输出:输出res对MOD取模的结果。

四、代码与注释

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

const int MOD = 9901; // 模数

// 快速幂计算 (base^exp) % MOD
long long qpow(long long base, long long exp) {
    long long res = 1;
    while (exp) {
        if (exp & 1) res = res * base % MOD; // 若指数为奇数,累乘
        base = base * base % MOD; // 底数平方优化
        exp >>= 1; // 右移等价于除以2
    }
    return res;
}

// 计算等比数列和 (1 + p + p^2 +... + p^e) % MOD
long long sum(long long p, long long e) {
    if (e == 0) return 1; // 边界:e=0时和为1
    if (p == 0) return 0; // p=0时和为0
    
    if (e % 2 == 1) { // 奇数项:拆分为中间项乘前半部分
        return (1 + qpow(p, (e+1)/2)) * sum(p, (e-1)/2) % MOD;
    } else { // 偶数项:拆分为前半部分乘中间项 + p^e
        return ((1 + qpow(p, e/2)) * sum(p, e/2-1) + qpow(p, e)) % MOD;
    }
}

int main() {
    int a, b;
    cin >> a >> b;
    
    if (a == 0) { // 特判a=0
        cout << 0 << endl;
        return 0;
    }
    
    int res = 1; // 结果初始化
    for (int i = 2; i*i <= a; i++) { // 质因数分解
        if (a % i == 0) {
            int cnt = 0;
            while (a % i == 0) { // 统计质因数i的个数
                a /= i;
                cnt++;
            }
            res = res * sum(i, cnt * b) % MOD; // 累乘每个质因数的贡献
        }
    }
    if (a > 1) { // 剩余大质因数单独处理
        res = res * sum(a, b) % MOD;
    }
    
    cout << res << endl;
    return 0;
}

注释说明:代码通过快速幂减少计算量,递归sum函数利用分治思想优化等比数列求和,质因数分解避免重复计算,最终结果取模保证正确性。

五、总结

1. 核心思想:将高次幂问题转化为质因数分解与等比数列求和,结合快速幂降低时间复杂度。

2. 优化技巧:递归分治简化公式推导,质因数分解减少循环次数,取模运算避免溢出。

3. 适用场景:适用于涉及大数幂运算与质因数分解的竞赛题目,需平衡精度与效率。

4. 扩展思考:若MOD为质数,可尝试欧拉定理进一步优化,但本题MOD=9901为合数,需依赖现有方法。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

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

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

一、题目解读2023年GESP五级题「因式分解」(洛谷B3871)要求将给定的大整数N分解为质因数的乘积形式,并输出每个质因数及其指数。题目考察核心算法为质因数分解,需高效处理大数分解,避免超时。难点...

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

一、题目解读洛谷P1121题要求求解环形数组的最大子段和,即在一个环形数组中找到一个连续子段,使其元素和最大。环形数组的特殊性在于首尾元素可相连,需考虑线性子段与跨越首尾的环形子段两种情况。二、解题思...

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

一、题目解读洛谷P1141题目要求处理一个由字符构成的迷宫,其中相同字符形成连通块,不同字符构成分隔。题目需统计连通块数量及大小,并支持查询两点是否属于同一连通块。核心在于高效识别并标记迷宫中的连通区...

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

一、题目解读洛谷P3393题要求在一个包含N个城市和M条双向道路的图中,求解从起点1到终点N的最小花费路径。图中存在僵尸城市(僵尸无法通过)和危险城市(由僵尸城市扩散S步后标记),需要避开所有危险城市...

洛谷P2789题解:递归算法与避免重复计算的技巧

洛谷P2789题解:递归算法与避免重复计算的技巧

一、题目解读洛谷P2789题要求计算n条直线在平面上两两相交产生的交点总数。题目强调交点不重复,需考虑平行线情况。关键点在于如何高效枚举所有可能的交点组合,并排除重复结果。二、解题思路采用递归算法,核...

发表评论

访客

看不清,换一张

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