1 条题解
-
0
题目回顾
A. 枫树与乘法
每次测试时间限制: 秒
每次测试内存限制: 兆字节枫树有两个正整数 和 。她可以执行任意多次(可能为零次)如下操作,使得 等于 :
- 选择任意正整数 ,并将 或 乘以 。
求最少操作次数。可以证明答案总是存在。
输入: 个测试用例,每个用例一行两个整数 ()。
输出:每个用例一行,最少操作次数。
题解
情况一:
此时两数已经相等,不需要任何操作。
情况二:一个数能被另一个数整除
假设 能被 整除,即 。
那么我们可以选择 ,将 乘以 ,得到:一次操作后 变为 ,两数相等。
同理,如果 能被 整除,一次操作将 乘以 即可。因此:
$$\text{答案} = 1 \quad \text{当} \quad a \mid b \ \text{或} \ b \mid a \ \text{且} \ a \ne b $$其中 表示 整除 。
情况三:其他情况(互不整除)
此时一次操作无法完成,因为:
- 若只动 使其等于 ,需要 为整数,但 ;
- 若只动 使其等于 ,需要 为整数,但 。
但是两次操作总是可行的。
我们取 ,然后:- 将 乘以 ,得到 ;
- 将 乘以 ,得到 。
两次操作后,两个数都等于 。
因此:
$$\text{答案} = 2 \quad \text{当} \quad a \nmid b \ \text{且} \ b \nmid a $$
最终分段函数
综合以上三种情况:
$$\boxed{ \text{答案} = \begin{cases} 0, & a = b \\[4pt] 1, & a \mid b \ \text{或} \ b \mid a \ \text{且} \ a \ne b \\[4pt] 2, & \text{否则} \end{cases} } $$
复杂度分析
每个测试用例只需进行 次整除判断,总时间复杂度 ,空间复杂度 ,完全满足 的限制。
代码实现(C++)
#include <bits/stdc++.h> using namespace std; typedef long long ll; int solve() { int a, b; cin >> a >> b; if (a == b) return 0; if (a % b == 0 || b % a == 0) return 1; return 2; } int main() { ios::sync_with_stdio(false); int TC; cin >> TC; while (TC--) { cout << solve() << '\n'; } return 0; }
示例验证
输入:
3 1 2 10 3 1000 1000- : 能被 整除?不,是 能被 整除?否。但 吗?注意判断条件
a % b == 0 || b % a == 0:
,,成立 → 输出 ✅ - :,,都不为 → 输出 ✅
- :相等 → 输出 ✅
输出:
1 2 0与题目示例完全一致。
- 1
信息
- ID
- 6347
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者