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

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

2个月前 (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:递归分治的艺术 如何用最大元素构建二叉树

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

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

一、题目解读洛谷P2190题要求解决铁路售票系统中的车厢数量计算问题。题目给定n个车站和m条订票申请,每条申请包含区间[x,y)及乘客数z。需要计算在不超载的情况下(每节车厢最多36人),满足所有乘客...

【CSP-J 2021】分糖果题(洛谷P7909)解题思路与代码解析

【CSP-J 2021】分糖果题(洛谷P7909)解题思路与代码解析

一、题目解读2021年CSP-J分糖果问题(洛谷P7909)要求计算在给定的糖果数量n及区间范围L和R下,糖果分配后剩余糖果数的最大值。核心目标是通过数学逻辑确定R mod n的最大可能余数,需考虑区...

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

一、题目解读洛谷2652题要求对一组扑克牌进行排序,目标是找到最少需要调整的次数,使得所有牌形成同花顺。题目中,扑克牌由花色和数字组成,需先按花色排序,再在同花色内按数字排序。核心难点在于如何处理花色...

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

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

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

发表评论

访客

看不清,换一张

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