此题还是比较难转化的,一开始很容易让人看懵逼。
题目:给一个质因子数目m,你要选小于等于m个质因子,好因子的定义是能被每个质因子整除,翻译一下就是如果是2,3,3,5,那么他可以只选2,3,5,也可以选2,3,3,5。这样就有两个好因子。所以,这m个质因子要分配多少个相同的,多少个不同的,是个问题。
设质数为a,这个数为
a
1
k
1
∗
a
2
k
2
∗
.
.
.
∗
a
j
k
j
a_1^{k_1}*a_2^{k_2}*...*a_j^{k_j}
a1k1∗a2k2∗...∗ajkj
其中,
k
1
+
k
2
+
.
.
.
k
j
<
=
m
k_1+k_2+...k_j<=m
k1+k2+...kj<=m
从第一个式子中,我们可以发现,
a
1
a_1
a1被选择一共有
k
1
k_1
k1种可能,所以目标就是
m
a
x
{
k
1
∗
k
2
∗
.
.
.
∗
k
j
}
max\{k_1*k_2*...*k_j\}
max{k1∗k2∗...∗kj}
第二个式子一定要取等于,让质因数个数变最多,这样好因子数也会更多。
然后我们就会发现,这个就是切绳子问题,用快速幂做即可。
有一个和切绳子不同的地方,就是切绳子问题必须要切,但此问题在只有一个质因数时是可以不切的,就导致前几个数和切绳子问题的解不同。
class Solution {
int MOD = 1e9+7;
typedef long long ll;
public:
int pow(ll a, int n)
{
if(n == 0)return 1;
ll ret = pow(a, n/2);
ret = (ret*ret)%MOD;
if(n&1)ret = ret*a%MOD;
return ret%MOD;
}
int maxNiceDivisors(int primeFactors) {
vector<int> ret{0, 1, 2, 3, 4, 6, 9};
if(primeFactors <= 6)return ret[primeFactors];
ll res;
if(primeFactors%3 == 1)
{
res = pow(3, primeFactors/3-1);
return res*4%MOD;
}
res = pow(3, primeFactors/3);
if(primeFactors%3 > 0)return res*2%MOD;
return res;
}
};