题目要求
故事背景
在春日的校园里,图书馆旁的长廊总是弥漫着淡淡的花香。帅气又神秘的 Ntarsis,就像那抹清风,手里捧着一个长方体的盒子 B。这个盒子 B 就是他与心仪之人之间的距离——长为 x、宽为 y、高为 z,从坐标 (0,0,0) 延伸到 (x,y,z),稳稳地摆放在课桌一隅,仿佛暗恋的心事,清晰却又隐藏。
在他心底深处,还藏着另一个更小、更精巧的盒子 S,那是他对暗恋对象的悸动与期待。这个盒子 S 的体积恰好是 k,他希望 S 的长、宽、高都为正整数,就像他对喜欢的人,每一个小小的心意都真实而具体。只要把 S 放进 B,就像把心意放进那段青涩的暗恋里:
S 要与坐标轴平行,就像他对她的情感,始终保持着真诚与坚定。
S 的每个顶点都落在整数坐标上,就如同他对她的每一次鼓起勇气,都是一次清晰可见的表白。
S 是魔法盒,放在 B 里不会掉落,正如他的心意一旦表达,就会牢牢地留在她的心里。
任务描述
Ntarsis 想在所有可能的 S 的尺寸(长、宽、高为正整数且体积为 k)中,选出一个最能“游走”于盒子 B 里的 S,让他可以有 最多 种不同的位置去偷偷安放这份心意。S 一旦选定尺寸,就不能旋转——就像他对暗恋的那份情感,方向已定,无法更改。现在,请你帮他计算:在每一种测试情况下,他最多可以有多少种不同的方式,将这份心意放进那段距离(盒子 B)里。
如果找不到任何一种尺寸的 S 能放进 B,就意味着这份心意无处释放,输出 0。
输入格式
第一行四个整数 x, y, z, k
—— 盒子 B 的长宽高 x,y,z(1≤x,y,z≤2000),以及心意盒子 S 的体积 k(1≤k≤x·y·z)。
输出格式
输出一个整数——Ntarsis 能选出的 S 放置方案的最大数量。如果所有可行的 S 大小都无法放入 B,则输出 0。
输入数据:
给定输入数据:
13 14 520 15155
实现步骤
1.操作观察
1。首先,这个 S 必须能放进 B。这意味着它的尺寸不能超过 B 的对应尺寸:a <= x, b <= y, c <= z。
2。其次,如果 a * b * c = k,那么 a, b, c 都必须是 k 的约数。
3。最后S 的范围是从 (p, q, r) 延伸到 (p+a, q+b, r+c)。
为了让整个 S 都在 B 内部(B 的范围是从 (0,0,0) 到 (x,y,z)),必须满足:
p >= 0
q >= 0
r >= 0
p + a <= x => p <= x - a
q + b <= y => q <= y - b
r + c <= z => r <= z - c
所以,p 的取值范围是 0, 1, …, x - a,共有 (x - a) - 0 + 1 = x - a + 1 种选择。
同理,q 的取值范围是 0, 1, …, y - b,共有 y - b + 1 种选择。
同理,r 的取值范围是 0, 1, …, z - c,共有 z - c + 1 种选择。
由于 p, q, r 的选择是独立的,对于这一组尺寸 (a, b, c),总的放置位置数量就是这三个可能性的乘积:(x - a + 1) * (y - b + 1) * (z - c + 1)。
2.实现思路
读取 x,y,z,n。
枚举 S 三个边长可能取值:两层循环+判断是否为约数确定可能的边长取值。
计算每一次枚举的可能方案数,在找到可能的方案后每次更新最大值ans
输出ans。
代码示例
// 不带T
#include <bits/stdc++.h>
using namespace std;
typedef long long i64;
typedef __int128_t i128;
const int M = 1e9 + 7;
#define N 200005void solve()
{int x, y, z, k;cin >> x >> y >> z >> k;i64 ans = 0;for (int p = 1; p <= x; p++){if (k % p != 0)continue;i64 remain = k / p;for (int q = 1; q <= y; q++){if (remain % q != 0)continue;i64 r = remain / q;if (r <= z){i64 t = (x - p + 1) * (y - q + 1) * (z - r + 1);ans = max(ans, t);}}}cout << ans;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);solve();return 0;
}
答案
运行代码得到答案6336