leetcode 1808 好因子数目 切绳子变形

此题还是比较难转化的,一开始很容易让人看懵逼。
题目:给一个质因子数目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} a1k1a2k2...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{k1k2...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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值