1 条题解
-
0
题目详解:B. Laura and Operations
问题描述
给定三个非负整数 ,分别表示数字 、、 的初始个数。
允许的操作:选择两个不同的数字(例如 和 ),将它们擦除,然后写入与这两个数字都不同的第三个数字 ( 且 )。
问:经过若干次(包括零次)操作后,能否使黑板上只剩下数字 ?只剩下数字 ?只剩下数字 ?
对每个测试用例输出三个 表示是否可行。关键观察
每次操作会改变三个数字的个数:
- 选择数字 和 → 擦掉一个 和一个 ,写入一个 。
效果:。 - 选择数字 和 → 擦掉一个 和一个 ,写入一个 。
效果:。 - 选择数字 和 → 擦掉一个 和一个 ,写入一个 。
效果:。
不变量分析
考虑三个数的奇偶性(模 的值)。
观察每次操作对奇偶性的影响:- 操作 : 减少 (奇偶翻转), 减少 (翻转), 增加 (翻转)。
三个数的奇偶性全部翻转。 - 操作 : 减 (翻转), 加 (翻转), 减 (翻转) → 三个奇偶性全部翻转。
- 操作 : 加 (翻转), 减 (翻转), 减 (翻转) → 三个奇偶性全部翻转。
因此每次操作后,三个数的奇偶性同时取反。换句话说,任意两个数奇偶性的相等关系保持不变:
如果开始时 和 奇偶相同,那么经过任意次操作后, 和 仍然奇偶相同;如果开始时它们奇偶不同,那么永远不同。
同理, 和 的奇偶相等关系也是不变量。目标状态分析
假设我们想要最终只剩下数字 ,即最终状态为 ,其中 (总个数不变,因为每次操作减少两个增加一个,总数减 ?等等:每次操作擦掉 个数字,写入 个数字,所以总数减少 。初始总数为 ,经过 次操作后总数为 。最终只剩下一种数字,设其个数为 ,则 。因此最终个数 可以是 ,并不固定。但奇偶性分析仍然适用,因为最终状态中,其余两个数字个数为 。
- 最终只剩 :,。
此时 和 的奇偶性都是 (偶数),它们相同。
根据不变量,初始的 和 必须奇偶相同。 - 最终只剩 :, → 初始 和 必须奇偶相同。
- 最终只剩 :, → 初始 和 必须奇偶相同。
充分性证明
上述奇偶相同条件是否也是充分的?是的,可以通过构造操作序列证明。
以只剩 为例,假设 和 奇偶相同。
步骤 1:反复执行操作 ,即每次减少一个 和一个 ,增加一个 。只要 且 ,就执行该操作。
经过若干次后,要么 ,要么 (或同时为 )。因为 和 奇偶相同,它们会同时变成 (若 ),或者一个为 另一个为偶数(因为同奇偶且差为偶数)。- 若 ,已经只剩 ,完成。
- 否则,不妨设 ,,且 为偶数(因为同奇偶, 是偶数,所以 也是偶数)。
此时执行两次操作组合:
① 选择 和 → 擦掉 和 ,写入 :。
② 选择 和 → 擦掉 和 ,写入 :。
这两步合并效果: 减少 , 不变( 先减 后加 ), 恢复为 。
重复此组合 次,最终 变为 ,且 ,只剩下 。
对于只剩 或只剩 的情况,构造完全对称。
结论
- 可以只剩 与 奇偶相同,即 。
- 可以只剩 与 奇偶相同,即 。
- 可以只剩 与 奇偶相同,即 。
算法实现
对于每个测试用例,只需计算三个奇偶性比较并输出 。
时间复杂度 每个测试用例,总复杂度 。代码(C++)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int a, b, c; cin >> a >> b >> c; cout << ((b % 2 == c % 2) ? "1" : "0") << " "; cout << ((a % 2 == c % 2) ? "1" : "0") << " "; cout << ((a % 2 == b % 2) ? "1" : "0") << "\n"; } return 0; }示例验证
- 输入
1 1 1: 奇偶相同 → 1; 相同 → 1; 相同 → 1 → 输出1 1 1。 - 输入
2 3 2: 奇偶不同 → 0; 相同 → 1; 不同 → 0 → 输出0 1 0。 - 输入
82 47 59: 同为奇数 → 1; 不同 → 0; 不同 → 0 → 输出1 0 0。
与题目示例完全一致。
- 选择数字 和 → 擦掉一个 和一个 ,写入一个 。
- 1
信息
- ID
- 6454
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者