题解 | #小苯的数字权值#
假设 表示质因子
的数量,定义
为一个数拆成其全部质因子的权值,定义
为一个数不拆情况下的权值,也就是一个数的因子数量,一个数因子的数量是其每个质因子数量加一的乘积,如何证明?举个例
,而 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));
}
})();