给你一个正整数 primeFactors
。你需要构造一个正整数 n
,它满足以下条件:
n
质因数(质因数需要考虑重复的情况)的数目 不超过primeFactors
个。n
好因子的数目最大化。如果n
的一个因子可以被n
的每一个质因数整除,我们称这个因子是 好因子 。比方说,如果n = 12
,那么它的质因数为[2,2,3]
,那么6
和12
是好因子,但3
和4
不是。
请你返回 n
的好因子的数目。由于答案可能会很大,请返回答案对 109 + 7
取余 的结果。
请注意,一个质数的定义是大于 1
,且不能被分解为两个小于该数的自然数相乘。一个数 n
的质因子是将 n
分解为若干个质因子,且它们的乘积为 n
。
示例 1:
输入:primeFactors = 5 输出:6 解释:200 是一个可行的 n 。 它有 5 个质因子:[2,2,2,5,5] ,且有 6 个好因子:[10,20,40,50,100,200] 。 不存在别的 n 有至多 5 个质因子,且同时有更多的好因子。
示例 2:
输入:primeFactors = 8 输出:18
提示:
1 <= primeFactors <= 109
方法一:问题转换 + 快速幂
我们可以将
而根据题意描述,我们知道 primeFactors
拆分成 primeFactors
拆分成若干个整数的乘积,使得乘积最大。
接下来,我们只需要分情况讨论。
- 如果
$primeFactors \lt 4$ ,那么直接返回primeFactors
即可。 - 如果
$primeFactors$ 为$3$ 的倍数,那么我们将primeFactors
拆分成$3$ 的倍数个$3$ ,即$3^{\frac{primeFactors}{3}}$ 。 - 如果
$primeFactors$ 除以$3$ 余$1$ ,那么我们将primeFactors
拆分成$\frac{primeFactors}{3} - 1$ 个$3$ ,再乘以$4$ ,即$3^{\frac{primeFactors}{3} - 1} \times 4$ 。 - 如果
$primeFactors$ 除以$3$ 余$2$ ,那么我们将primeFactors
拆分成$\frac{primeFactors}{3}$ 个$3$ ,再乘以$2$ ,即$3^{\frac{primeFactors}{3}} \times 2$ 。
以上过程中,我们利用快速幂取模求解。
时间复杂度
class Solution:
def maxNiceDivisors(self, primeFactors: int) -> int:
mod = 10**9 + 7
if primeFactors < 4:
return primeFactors
if primeFactors % 3 == 0:
return pow(3, primeFactors // 3, mod) % mod
if primeFactors % 3 == 1:
return 4 * pow(3, primeFactors // 3 - 1, mod) % mod
return 2 * pow(3, primeFactors // 3, mod) % mod
class Solution {
public int maxNiceDivisors(int primeFactors) {
if (primeFactors < 4) {
return primeFactors;
}
final int mod = (int) 1e9 + 7;
if (primeFactors % 3 == 0) {
return (int) qmi(3, primeFactors / 3, mod);
}
if (primeFactors % 3 == 1) {
return (int) (4 * qmi(3, primeFactors / 3 - 1, mod) % mod);
}
return (int) (2 * qmi(3, primeFactors / 3, mod) % mod);
}
private long qmi(long a, long k, long p) {
long res = 1;
while (k != 0) {
if ((k & 1) == 1) {
res = res * a % p;
}
k >>= 1;
a = a * a % p;
}
return res;
}
}
class Solution {
public:
int maxNiceDivisors(int primeFactors) {
if (primeFactors < 4) {
return primeFactors;
}
const int mod = 1e9 + 7;
if (primeFactors % 3 == 0) {
return qmi(3, primeFactors / 3, mod);
}
if (primeFactors % 3 == 1) {
return 4 * qmi(3, primeFactors / 3 - 1, mod) % mod;
}
return 2 * qmi(3, primeFactors / 3, mod) % mod;
}
long qmi(long a, long k, long p) {
long res = 1;
while (k != 0) {
if ((k & 1) == 1) {
res = res * a % p;
}
k >>= 1;
a = a * a % p;
}
return res;
}
};
func maxNiceDivisors(primeFactors int) int {
if primeFactors < 4 {
return primeFactors
}
const mod int = 1e9 + 7
if primeFactors%3 == 0 {
return qmi(3, primeFactors/3, mod)
}
if primeFactors%3 == 1 {
return 4 * qmi(3, primeFactors/3-1, mod) % mod
}
return 2 * qmi(3, primeFactors/3, mod) % mod
}
func qmi(a, k, p int) int {
res := 1
for k != 0 {
if k&1 == 1 {
res = res * a % p
}
k >>= 1
a = a * a % p
}
return res
}