算法-小苯的数字权值

50 阅读1分钟

image.png

题解 | #小苯的数字权值#

假设  表示质因子  的数量,定义  为一个数拆成其全部质因子的权值,定义  为一个数不拆情况下的权值,也就是一个数的因子数量,一个数因子的数量是其每个质因子数量加一的乘积,如何证明?举个例  ,而 12 的因子其实就是在修改等式右边的指数,每个数  的指数的取值范围是  ,指数为几就代表选择了几个这个质因子,最后乘积一定是 12 的一个因子,现在我们来分类讨论不同情况

当一个数只有一个质因子  时

很明显无论  是多少都应该选  也就是拆开

当一个数有多个质因子时

显然这时乘法一定优于加法,选择  也就是不拆

以下是算法的javascript 实现

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    let params = [];
    while ((line = await readline())) {
        let tokens = line.split(" ");
        // let a = parseInt(tokens[0]);
        // let b = parseInt(tokens[1]);
        // console.log(a + b);
        params.push(tokens);
    }

    // 定义一个计算质因数分解下正因子的函数
    function maxWeightValue(x) {
        if (x <= 2) return 2;
        let px = 0;
        let max1 = 1;
        let sum = 0;
        // 分解质因数,这里每次找到一个质因数,计数加2
        for (let j = 2; j * j <= x; j++) {
            px = 0;
            while (x % j === 0) {
                px++;
                x = x / j;
                // if (x == 1) {
                //     break;
                // }
            }
            max1 = max1 * (px + 1);
            sum += 2 * px;
        }
        //  // 处理剩余的质数 如果 x > 1,说明 x 是一个质数
        if (x > 1) {
            max1 *= 2;
            sum += 2;
        }
        return Math.max(max1, sum);
    }

    let T = parseInt(params[0][0]);
    for (let i = 1; i <= T; i++) {
        let n = parseInt(params[i][0]);
        console.log(maxWeightValue(n));
    }
})();