洛谷P1593题解:质因数分解与快速幂优化求解
一、题目解读
洛谷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为合数,需依赖现有方法。
原创内容 转载请注明出处