leetcode
leetcode 1601 ~ 1650
好因子的最大数目

好因子的最大数目

难度:

标签:

题目描述

代码结果

运行时间: 28 ms, 内存: 16.1 MB


/*
 * Problem: Given a positive integer 'primeFactors', you need to construct a positive integer 'n' that meets the following conditions:
 * 1. The number of prime factors (considering repeated factors) of 'n' does not exceed 'primeFactors'.
 * 2. The number of good factors of 'n' is maximized. A factor of 'n' is called a good factor if it can be divided by each prime factor of 'n'.
 * The result should be returned modulo 10^9 + 7.
 *
 * Approach using Java Stream API: The problem can be approached in a similar way as traditional Java.
 * We use streams for calculation where possible, especially in the modPow method.
 */

import java.util.stream.Stream;

public class Solution {
    private static final int MOD = 1000000007;

    public int maxGoodFactors(int primeFactors) {
        if (primeFactors <= 3) return primeFactors;
        long result = 1;
        if (primeFactors % 3 == 0) {
            result = modPow(3, primeFactors / 3);
        } else if (primeFactors % 3 == 1) {
            result = (modPow(3, primeFactors / 3 - 1) * 4) % MOD;
        } else if (primeFactors % 3 == 2) {
            result = (modPow(3, primeFactors / 3) * 2) % MOD;
        }
        return (int) result;
    }

    private long modPow(long base, int exp) {
        return Stream.iterate(new long[]{1, base}, e -> new long[]{
            e[1] * e[1] % MOD, e[0] * ((exp & 1) == 1 ? e[1] : 1) % MOD
        })
        .limit(exp + 1)
        .map(e -> e[0])
        .reduce((a, b) -> b)
        .get();
    }
}

解释

方法:

题解基于分解质因数的方式来最大化好因子数目。通过分析可以发现,将整数n分解为多个3的乘积时,可以得到更多的好因子。具体策略为:1. 当primeFactors小于或等于3时,直接返回primeFactors,因为无法形成更多的好因子。2. 当primeFactors大于3时,首先计算将primeFactors尽可能多地分为3的组合,计算剩余的质因数数目。如果剩余1个,最优策略是使用一个2和两个3组成的数(即2*3*3),如果剩余2个,使用两个2更优(即2*2*3)。使用快速幂算法来高效计算大数的乘积的模。

时间复杂度:

O(log n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么选择3的乘积可以得到更多的好因子?请解释这种策略背后的数学原理。
选择3的乘积来最大化好因子的数目基于一个数学原理:若要使得一组数的乘积固定时,这些数的和越大,则它们的乘积构成的因子数目通常越多。在给定总和的情况下,尽量使得各分组之间的大小差异最小(即尽量均匀分配),可以获得较大的乘积。例如,3+3+3+3比2+2+2+4来得大。数学上可以通过不等式证明,当所有数均为3时,其乘积最大。这是因为当分解的数均为3时,3的指数总和在不超过原有质因数的前提下达到最大,从而使得乘积的分解项(好因子)最大化。这一原理可以通过拉格朗日乘数法或者算术几何均值不等式来进行数学证明。
🦆
题解中提到,当剩余的质因数为1时,使用一个2和两个3组成的数(即2*3*3)更优,为什么不直接使用3个3(即3*3*3)而选择减少一个3增加一个2?
当剩余的质因数为1时,如果直接使用3个3(即3*3*3=27)与使用一个2和两个3(即2*3*3=18)相比,虽然27大于18,但关键在于如何使用已有的质因数总数。如果总质因数为10,那么使用3*3*3*1的组合,相当于浪费了一个1,而2*3*3可以更有效地利用这个额外的1(变为2),形成2*(3*3)=18,而不是27*1=27。因此,在总质因数固定的情况下,选择2*3*3可以避免浪费质因数,使得所有质因数都能得到有效利用。
🦆
快速幂算法在计算时为何优先考虑处理指数中的奇数情况,这样做的优点是什么?
快速幂算法在计算时优先考虑处理指数中的奇数情况,其目的是为了确保算法的效率。当指数为奇数时,可以将当前底数乘到结果中,并将指数减少1转化为偶数,这样就可以通过指数的每次除以2(右移一位操作)来减半处理次数。这种方法利用了位运算的高效性,能够显著减少乘法操作的次数。每当指数为奇数时,通过处理这种情况,可以确保算法的每一步都是必要的,从而加快乘幂计算的速度。

相关问题