1 条题解
-
0
题目回顾
给定两个整数 和 ,执行一次操作:
- 选择一个能整除 的整数 ;
- 同时执行:,。
求操作后 的最大偶数值;若无法得到偶数,输出 。
核心结论(标程思路)
这道题的本质是数学规律 + 贪心: 操作后 的乘积永远不变,即:
我们的目标是:在 的所有正整数对 中,找到最大的偶数和 。
关键数学推导
1. 和的奇偶性规律
- 偶数 + 偶数 = 偶数
- 奇数 + 奇数 = 偶数
- 奇数 + 偶数 = 奇数
要让 为偶数,必须满足: 和 同奇偶。
2. 最大和的贪心策略
固定乘积 (), 的最大值出现在 一个数尽可能大,另一个尽可能小 时:
- 最大和 = (对应 )
- 次大合法和 = (对应 ,仅当 为偶数时合法)
分情况完整解法
设 。
情况 1: 和 都是奇数
- 是奇数,只能分解为 奇数 × 奇数;
- 最大合法偶数和 = ;
情况 2: 和 一奇一偶
- 只有一种合法偶数方案:;
- 前提: 能被 整除(必然满足);
情况 3: 和 都是偶数
- 本身就满足同奇偶,直接取原和 就是最大值;
无法得到偶数的唯一情况
- 当且仅当 一奇一偶,且 是奇数(无法选合法 );
- 此时输出 。
标程逻辑(C++ 标准代码)
#include <iostream> #include <algorithm> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { ll a, b; cin >> a >> b; ll ans = -1; ll s = a * b; // 原 a+b 已经是偶数,直接最优 if ((a + b) % 2 == 0) { ans = a + b; } // 两个都是奇数:最大和 1+s if (a % 2 == 1 && b % 2 == 1) { ans = max(ans, 1 + s); } // 一奇一偶:合法最大和 2 + s/2 else if (b % 2 == 0) { ans = max(ans, 2 + s / 2); } cout << ans << '\n'; } return 0; }
样例验证
样例 2:
- ,一奇一偶
- 答案 = ✔️
样例 3:
- 都是奇数
- 答案 = ✔️
样例 7:
- 都是偶数,原和 不是最优
- 合法最大和 = ✔️
总结
- 操作不改变乘积 ;
- 目标:找同奇偶的 使 最大;
- 贪心取最大合法值:
- 全奇 →
- 全偶 →
- 一奇一偶 →
- 唯一无解:一奇一偶且 为奇数 → 输出 。
- 1
信息
- ID
- 6490
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者