这道题非常有意思,它本质上是一个数学问题,结合了数论和贪心算法的思想。虽然题目描述看起来有些绕,但一旦你理解了“好因子”的本质,就会发现它其实是在问我们:如何将一个整数拆分,使得拆分后的乘积最大。

下面我为你详细拆解这道题的思路和代码实现。

🧐 核心思路分析

1. 什么是“好因子”?
假设我们将构造的数字 n 进行质因数分解:
n = p_1^{a_1} times p_2^{a_2} times dots times p_k^{a_k}
其中 p_i 是不同的质数,a_i 是该质数的指数(出现次数)。

题目中定义的“好因子”必须能被 n 的每一个质因数整除。这意味着,一个“好因子”必须包含 p_1, p_2, dots, p_k 至少各一次。
- 对于质因数 p_1,我们可以选择 p_1^1, p_1^2, dots, p_1^{a_1},共 a_1 种选择。
- 对于质因数 p_2,我们可以选择 p_2^1, p_2^2, dots, p_2^{a_2},共 a_2 种选择。
- ...
- 对于质因数 p_k,我们可以选择 p_k^1, p_k^2, dots, p_k^{a_k},共 a_k 种选择。

根据乘法原理,“好因子”的总数就是所有指数的乘积:
text{好因子数目} = a_1 times a_2 times dots times a_k

2. 转化为数学问题
题目限制质因子的总数量(考虑重复)不超过 primeFactors。
也就是说:a_1 + a_2 + dots + a_k le text{primeFactors}。

为了让好因子数目最大,我们应该用完所有的配额,即总和等于 primeFactors。
问题转化: 给定一个正整数 primeFactors,将其拆分为若干个正整数之和,使得这些正整数的乘积最大。

3. 贪心策略:尽可能拆出 3
这是一个经典的数学结论(类似于 LeetCode 343. 整数拆分):
- 不要拆出 1:1 times x 1),把 1 加到其他数上乘积会变大。
- 不要拆出大于 4 的数:比如 5,拆成 2+3,乘积 2 times 3 = 6 > 5。任何大于 4 的数 x 都可以拆成 3 和 x-3,且 3(x-3) > x。
- 4 可以看作 2+2:2 times 2 = 4,效果一样。
- 尽量拆成 3:如果有三个 2(2+2+2=6),乘积是 8;如果换成两个 3(3+3=6),乘积是 9。显然 3 times 3 > 2 times 2 times 2。所以 2 的个数不能超过 2 个。

结论: 我们应该尽可能多地拆分出 3。剩下的余数处理如下:
- 余数为 0:全部拆成 3。结果 = 3^{n/3}
- 余数为 1:拆出一个 4(即两个 2),其余全是 3。结果 = 4 times 3^{(n-4)/3} (因为 3 times 1  0) {
            // 如果指数是奇数,结果乘上当前的底数
            if ((exp & 1) == 1) {
                res = (res * base) % MOD;
            }
            // 底数自乘
            base = (base * base) % MOD;
            // 指数右移一位(除以 2)
            exp >>= 1;
        }
        return res;
    }
}

📝 关键点总结

1.  问题转化:这是解题最难的一步。你需要意识到“好因子数目”等于“质因数指数的乘积”。
2.  贪心法则:记住“尽量拆成 3”的原则。
    - 余 0 rightarrow 3^k
    - 余 1 rightarrow 3^{k-1} times 4
    - 余 2 rightarrow 3^k times 2
3.  数据范围:因为涉及大数幂运算,必须使用快速幂并将中间结果强制转换为 long 以防止溢出,最后再强转回 int。

希望这个解答能帮你彻底搞懂这道题!如果有哪里不清楚,欢迎继续问我。

 

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐