1 条题解

  • 0
    @ 2026-4-6 12:11:06

    我们一步步来分析这个问题。


    题意理解

    我们有:

    • 一个整数 xx(总难度)
    • 一个整数 nn(子题数量)

    要求:

    • 找到 nn 个正整数 a1,a2,,ana_1, a_2, \dots, a_n,使得
      a1+a2++an=xa_1 + a_2 + \dots + a_n = x
    • 定义平衡度 = gcd(a1,a2,,an)\gcd(a_1, a_2, \dots, a_n)
    • 我们要 最大化 这个平衡度。

    关键观察

    设最大可能的平衡度为 gg

    那么:

    • gg 必须能整除每个 aia_i,因此 ai=gbia_i = g \cdot b_i,其中 bib_i 是正整数。
    • 于是:x=g(b1+b2++bn)x = g \cdot (b_1 + b_2 + \dots + b_n) x=gSx = g \cdot S,其中 S=i=1nbinS = \sum_{i=1}^n b_i \ge n

    因此:

    • gg 必须是 xx 的一个正因数。
    • 并且 x/gnx/g \ge n(因为 SnS \ge n)。

    反过来:

    • ggxx 的因数,且 x/gnx/g \ge n,那么我们可以取 b1=x/g(n1)b_1 = x/g - (n-1)b2=b3==bn=1b_2 = b_3 = \dots = b_n = 1,那么:
      • bib_i 都是正整数(因为 x/gnx/g \ge n 保证了 b11b_1 \ge 1)。
      • ai=gbia_i = g \cdot b_i 满足和为 xx,且 gcd(a1,,an)=g\gcd(a_1, \dots, a_n) = g(因为至少有一个 ai=g1a_i = g \cdot 1 和其他都是 gg 的倍数,且 gg 是最大公因数)。

    结论

    最大平衡度就是:

    $$\max \{ g \mid g \text{ 是 } x \text{ 的因数,且 } x/g \ge n \} $$

    等价于:

    $$\max \{ g \mid g \text{ 是 } x \text{ 的因数,且 } g \le x/n \} $$

    即:xx 的所有因数中,不超过 x/nx/n 的最大因数


    算法

    对于每个测试用例:

    1. 枚举 xx 的所有因数 dd
    2. 检查 dx/nd \le x/n,维护最大值。
    3. 因为 x108x \le 10^8,枚举因数复杂度 O(x)O(\sqrt{x})t1000t \le 1000 时总操作数约 103×104=10710^3 \times 10^4 = 10^7,可行。

    也可以直接枚举 k=x/gk = x/g(即 bib_i 的和),那么 g=x/kg = x/k,要求 knk \ge nkk 整除 xx,此时 g=x/kg = x/k 为整数。我们取所有这样的 gg 的最大值。


    代码实现(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. x=10,n=3x=10, n=3
      x/n3.33x/n \approx 3.33
      因数有 1,2,5,101,2,5,10,不超过 3.333.33 的最大因数是 22。输出 22

    2. x=5,n=5x=5, n=5
      x/n=1x/n = 1
      因数有 1,51,5,不超过 11 的最大因数是 11。输出 11

    3. x=420,n=69x=420, n=69
      x/n6.086x/n \approx 6.086
      因数不超过 66 的最大因数是 66。输出 66

    匹配样例。


    复杂度

    每个测试用例 O(x)O(\sqrt{x}),总复杂度 O(txmax)O(t \sqrt{x}_{\max}),可通过。

    • 1

    信息

    ID
    6438
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    1
    已通过
    1
    上传者