(旧存档) 牛客多校第七场-B题
B 签到
题意
有 $n \times m$ 个口罩,你可以将 $x$ 个口罩包装为一盒,把多盒口罩包装为一箱。请问,怎么确定口罩盒的规格 $x$,可以分配 $n$ 个口罩在 $m$ 个箱子中,且可以分配 $m$ 个口罩在 $n$ 个箱子中。要求使用口罩盒的数量最小,且方案的字典序最大。
思路
通宵后,脑子真滴会很糊,那么简单的题竟然想不到。
假设 $n \le m$,为了满足:
- 可以分配 $m$ 个箱子, 每个箱子 $n$ 个口罩
- 可以分配 $n$ 个箱子, 每个箱子 $m$ 个口罩
由于每个盒子口罩数最多为 $n$,我们构建 $n$ 个口罩盒,每个口罩盒里有 $n$ 个口罩。
我们只需要剩下的口罩盒满足:
- 可以分配 $n$ 个箱子, 每个箱子 $m - n$ 个口罩
- 可以分配 $m - n$ 个箱子, 每个箱子 $n$ 个口罩
这显然是一个递归的过程,时间复杂度 $O(n)$
代码
#include <bits/stdc++.h>
using namespace std;
vector<int> ans;
void dfs(int n, int m) {
if (!n || !m) return;
if (n > m) swap(n, m);
for (int i = 0; i < n; ++i) ans.emplace_back(n);
dfs(n, m - n);
}
int main() {
int t, n, m;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
ans.clear();
dfs(n, m);
printf("%llu\n", ans.size());
for (int x: ans)
printf("%d ", x);
puts("");
}
return 0;
}