题目描述
给你一个正整数 primeFactors
。你需要构造一个正整数 n
,它满足以下条件:
n
质因数(质因数需要考虑重复的情况)的数目 不超过primeFactors
个。n
好因子的数目最大化。如果n
的一个因子可以被n
的每一个质因数整除,我们称这个因子是 好因子。比方说,如果n = 12
,那么它的质因数为[2,2,3]
,那么6
和12
是好因子,但3
和4
不是。
请你返回 n
的好因子的数目。由于答案可能会很大,请返回答案对 10^9 + 7
取余 的结果。
请注意,一个质数的定义是大于 1
,且不能被分解为两个小于该数的自然数相乘。一个数 n
的质因子是将 n
分解为若干个质因子,且它们的乘积为 n
。
样例
输入:primeFactors = 5
输出:6
解释:200 是一个可行的 n。
它有 5 个质因子:[2,2,2,5,5],且有 6 个好因子:[10,20,40,50,100,200]。
不存在别的 n 有至多 5 个质因子,且同时有更多的好因子。
输入:primeFactors = 8
输出:18
限制
1 <= primeFactors <= 10^9
算法
(数学,贪心) $O(\log n)$
- 假设 $n = p_1^{k_1}p_2^{k_2} \dots p_m^{k_m}$,则根据乘法原理,$n$ 的好因子个数为 $k_1k_2 \dots k_m$。
- 现在已知 $k_1 + k_2 + \dots + k_m = primeFactors$,求最大的 $k_1k_2 \dots k_m$。
- 根据贪心的结果,将数字尽可能的分成 $3$ 可以使结果最大。如果 $n = 3t + 1$,则分为 $t - 1$ 个 $3$ 外加两个 $2$;如果 $n = 3t + 2$,则分为 $t$ 个 3 外加一个 $2$;否则分为 $t$ 个 3。
- 使用快速幂计算最终答案。
时间复杂度
- 快速幂计算的时间复杂度为 $O(\log n)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
#define LL long long
class Solution {
private:
LL power(LL x, LL y, LL mod) {
LL res = 1, p = x;
for (; y; y >>= 1) {
if (y & 1) res = res * p % mod;
p = p * p % mod;
}
return res;
}
public:
int maxNiceDivisors(int primeFactors) {
if (primeFactors == 1)
return 1;
const int mod = 1000000007;
int m = primeFactors / 3;
if (primeFactors % 3 == 1)
return power(3, m - 1, mod) * 4 % mod;
if (primeFactors % 3 == 2)
return power(3, m, mod) * 2 % mod;
return power(3, m, mod) % mod;
}
};
根据贪心的结果,将数字尽可能的分成 33 可以使结果最大。这怎么得出的呢