1 条题解
-
0
我们一步步来分析这个问题。
题意理解
我们有:
- 一个整数 (总难度)
- 一个整数 (子题数量)
要求:
- 找到 个正整数 ,使得
。 - 定义平衡度 = 。
- 我们要 最大化 这个平衡度。
关键观察
设最大可能的平衡度为 。
那么:
- 必须能整除每个 ,因此 ,其中 是正整数。
- 于是: 即 ,其中 。
因此:
- 必须是 的一个正因数。
- 并且 (因为 )。
反过来:
- 若 是 的因数,且 ,那么我们可以取 ,,那么:
- 都是正整数(因为 保证了 )。
- 满足和为 ,且 (因为至少有一个 和其他都是 的倍数,且 是最大公因数)。
结论
最大平衡度就是:
$$\max \{ g \mid g \text{ 是 } x \text{ 的因数,且 } x/g \ge n \} $$等价于:
$$\max \{ g \mid g \text{ 是 } x \text{ 的因数,且 } g \le x/n \} $$即:在 的所有因数中,不超过 的最大因数。
算法
对于每个测试用例:
- 枚举 的所有因数 。
- 检查 ,维护最大值。
- 因为 ,枚举因数复杂度 , 时总操作数约 ,可行。
也可以直接枚举 (即 的和),那么 ,要求 且 整除 ,此时 为整数。我们取所有这样的 的最大值。
代码实现(C++ 标程风格)
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int x, n; cin >> x >> n; int ans = 1; for (int i = 1; i * i <= x; i++) { if (x % i == 0) { // i 是因数 if (i <= x / n) ans = max(ans, i); // 对应的另一个因数 int j = x / i; if (j <= x / n) ans = max(ans, j); } } cout << ans << '\n'; } return 0; }
验证样例
-
因数有 ,不超过 的最大因数是 。输出 。 -
因数有 ,不超过 的最大因数是 。输出 。 -
因数不超过 的最大因数是 。输出 。
匹配样例。
复杂度
每个测试用例 ,总复杂度 ,可通过。
- 1
信息
- ID
- 6438
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者