小苯现在拿到了一个正整数
输入包含行。
第一行一个正整数,表示数据组数。
接下来行,每行一个正整数
,表示每组数据中小苯询问的数字
。
输出包含行,每行一个正整数表示每组测试数据的最大权值和。
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; }