5716. 好因子的最大数目

题目大意:

题目链接
在这里插入图片描述
输入输出:
在这里插入图片描述

思路分析:

假设质因子的数目为k时:n可以表示为:Pi表示质因子,Ai表示对应质因子的个数
p 1 a 1 ∗ p 2 a 2 ∗ p 3 a 3 . . . . . ∗ p k a k {\color{Red} p1^{a1}*p2^{a2}*p3^{a3}.....*pk^{ak}} p1a1p2a2p3a3.....pkak,

根据题目要求满足:
∑ 1 k a i = p r i m e F a c t o r s {\color{Red} {\scriptsize {\textstyle \sum_{1}^{k}ai}=primeFactors} } 1kai=primeFactors
而好因子的要求必须被每一个质因子整除,所以每一个质因子都要选一次,类似与求约数个数那道题,好因子的数目个数为:
∏ i k a i {\color{Red} {\scriptsize \prod_{i}^{k}ai} } ikai
问题转化为:343. 整数拆分
这道经典数学问题的贪心解法为:将n的质因子拆分为只包含2和3:
证明如下:假设最优的质因子排列中存在一个Ai满足: a i ≥ 5 {\color{Red} {\tiny ai\ge 5} } ai5
不妨将ai拆成3和(ai-3),他们的乘积满足:
3 ∗ ( a i − 3 ) ≥ a i ≡ 2 ∗ a i ≥ 9 {\color{Red} {\tiny 3*(ai-3)\ge ai}} \equiv {\tiny 2*ai\ge 9 } 3(ai3)ai2ai9

将ai拆出一个3后结果不会变差,这样质因子ai满足a1<=4:
同理ai=4时可以拆成2*2,结果不变,追后的质因子只会包含2和3,
对于同样的和比如6,有 3*3>2*2*2,优先拆出3;

注意这道题的数据范围比较大,用快速幂加速

AC代码:

const int mod=1e9+7;
class Solution {
public:
    int qmi(int a,int b,int p){
        int res=1;
        while(b){
            if(b&1) res=1ll*res*a%p;
            a=1ll*a*a%p;
            b>>=1;
        }
        return res;
    }
    int maxNiceDivisors(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        int p=n/3,r=n%3;
        if(r==0){
            return qmi(3,p,mod);
        }
        else if(r==1){
            return qmi(3,p-1,mod)*4ll%mod;
        }
        else if(r==2){
            return qmi(3,p,mod)*2ll%mod;
        }
        return 0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值