第一行输入一个整数
表示测试数据组数。
此后
行,每行输入一个整数
。
对于每组数据,在一行上输出对应的最大权值和。
3 2 10 123
2 4 4
对于
,无法再分解,只能取自身,
。
对于
,最优方案为
,
,总和
。
对于
,最优方案为
,
,总和
。
#include <bits/stdc++.h>
using namespace std;
const int MAX = 200001;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Step 1: 预处理每个数的因子个数
int num_factors[MAX] = {0};
for (int i = 1; i < MAX; ++i) {
for (int j = i; j < MAX; j += i) {
num_factors[j]++;
}
}
// Step 2: 初始化 DP 数组
int dp[MAX];
for (int i = 2; i < MAX; ++i) {
dp[i] = num_factors[i]; // 初始为自己不做分解的情况
}
// Step 3: DP 更新最优解
for (int i = 2; i < MAX; ++i) {
for (int j = 2; j <= MAX / i; ++j) {
int product = i * j;
if (product < MAX) {
dp[product] = max(dp[product], dp[i] + dp[j]);
}
}
}
// Step 4: 读取输入并输出结果
int T;
cin >> T;
while (T--) {
int x;
cin >> x;
cout << dp[x] << '\n';
}
return 0;
}