1 条题解

  • 0
    @ 2026-5-5 21:24:40

    E. Secret Box 详细题解

    题目重述

    有一个大盒子 BB,尺寸为 x×y×zx \times y \times zx,y,z2000x, y, z \le 2000),放置在三维空间从 (0,0,0)(0,0,0)(x,y,z)(x,y,z) 的区域内。我们要选择一个小盒子 SS,其边长 a,b,ca, b, c 均为正整数,体积 abc=ka \cdot b \cdot c = k,并将其平行于坐标轴放置,所有角点坐标为整数,且完全位于 BB 内部(即 0ax0 \le a \le x 等)。问:在所有可能的 (a,b,c)(a,b,c) 选择中,SS 可以放置的位置数最大为多少?若不存在合法的 (a,b,c)(a,b,c),输出 00

    核心思路

    • 若固定 (a,b,c)(a,b,c),则 SS 的左下角(最靠近原点的角点)可以在 xx 方向上取 00xax-a 的整数,共 xa+1x-a+1 个位置;同样 yy 方向有 yb+1y-b+1 个位置,zz 方向有 zc+1z-c+1 个位置。因此总放置方法数为:
    (xa+1)(yb+1)(zc+1).(x - a + 1) \cdot (y - b + 1) \cdot (z - c + 1).
    • 我们需要在所有满足 abc=ka \cdot b \cdot c = k 的正整数三元组 (a,b,c)(a,b,c) 中,最大化上式,并输出最大值(若无合法三元组则输出 00)。

    数据范围与特点

    • x,y,z2000x, y, z \le 2000,且所有测试用例的 x,y,zx, y, z 各自的总和不超过 20002000,因此单次最多 20002000
    • kk 可能很大(最大 xyz8109x\cdot y\cdot z \le 8\cdot 10^9),但 kk 的因子个数不会很多(最坏情况下,k8×109k \le 8\times 10^9 时约 10310^3 量级)。
    • 我们可以通过枚举 aabb 的方式,但直接枚举 aa11xxbb11yy 会达到 O(xy)O(x \cdot y),最多 4×1064\times 10^6,虽然可行但可优化。更高效的方法是枚举 kk 的所有因子作为 aa,再枚举因子作为 bb,这样只需枚举 O(d(k)2)O(d(k)^2) 种组合,其中 d(k)d(k)kk 的因子个数,通常很小。

    算法步骤

    1. 读入 x,y,z,kx, y, z, k
    2. 枚举 kk 的所有正因子,存入列表 DD
    3. DD 排序(便于剪枝)。
    4. 初始化答案 ans=0ans = 0
    5. 对每个 aDa \in D,若 a>xa > x 则终止(因为 aa 递增,后续更大)。
      • r=k/ar = k / arr 是剩余部分)。
      • 对每个 bDb \in D,若 b>yb > y 则终止。
        • rr 不能被 bb 整除,跳过。
        • 否则 c=r/bc = r / b,若 czc \le z,则计算:$$ways = (x - a + 1) \cdot (y - b + 1) \cdot (z - c + 1) $$并更新 ans=max(ans,ways)ans = \max(ans, ways)
    6. 输出 ansans

    正确性证明

    • 任何合法的 (a,b,c)(a,b,c) 必须满足 aka \mid kb(k/a)b \mid (k/a)c=k/(ab)c = k/(ab),因此 aabb 必须是 kk 的因子。枚举所有因子对即可覆盖所有可能。
    • 放置位置数由公式给出,取最大值即可。
    • 若没有合法的 (a,b,c)(a,b,c),则 ansans 保持 00,输出 00

    复杂度分析

    • 预处理因子:O(k)O(\sqrt{k}),由于 kk 最大约 8×1098\times 10^9k105\sqrt{k} \le 10^5,但实际 x,y,z2000x,y,z\le 2000 限制了 kk 的上限,且所有测试用例的总 x,y,zx,y,z 很小,因此枚举所有因子在时间允许范围内。
    • 枚举因子对:O(d(k)2)O(d(k)^2)d(k)d(k) 通常很小(如 k=230k= 2^{30} 时约 3131k=109k= 10^9 时最多 13441344),因此 d(k)2d(k)^2 最大约 1.8×1061.8\times 10^6,加上排序和循环剪枝,在 t2000t\le 2000 且总 x,y,zx,y,z2000\le 2000 的条件下可以轻松通过。

    边界情况

    • k=1k=1 时,因子只有 11,那么 a=b=c=1a=b=c=1,放置方法数为 xyzx \cdot y \cdot z
    • 当存在 a>xa > xb>yb > yc>zc > z 时,该三元组不可用,直接跳过。
    • 若没有任何因子对满足 ax,by,cza \le x, b \le y, c \le z,输出 00

    示例验证

    • 样例 11x=3,y=3,z=3,k=8x=3,y=3,z=3,k=8。因子有 1,2,4,81,2,4,8。枚举:
      • a=2,b=2,c=2a=2,b=2,c=2:位置数 (32+1)3=8(3-2+1)^3 = 8,最大。
      • a=1,b=1,c=8a=1,b=1,c=8 不合法(c>3c>3)。答案为 88
    • 样例 22k=18k=18,因子 1,2,3,6,9,181,2,3,6,9,18。最优 (2,3,3)(2,3,3) 位置数 (32+1)(33+1)(33+1)=211=2(3-2+1)\cdot(3-3+1)\cdot(3-3+1)=2\cdot1\cdot1=2,与输出一致。
    • 样例 33x=5,y=1,z=1,k=1x=5,y=1,z=1,k=1,只有 (1,1,1)(1,1,1),位置数 511=55\cdot1\cdot1=5,正确。
    • 样例 44x=2,y=2,z=2,k=7x=2,y=2,z=2,k=7,因子有 1,71,7c=7>2c=7>2a=b=7a=b=7 无效,答案为 00

    总结

    本题的关键在于将几何放置问题转化为对体积 kk 的因子分解,并计算每个因子组合产生的放置位置数。由于 x,y,zx,y,z 很小,枚举因子即可高效求解。注意使用 6464 位整数存储乘积,避免溢出。

    • 1

    信息

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