A Number Between Two Others 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题判断在给定 x \mid y 的条件下,是否存在整数 z 满足 x < z < y、x \mid z 且 z \nmid y。
核心解法是将问题转化为判断比值 y/x 是否为 2,若不是则一定存在这样的 z。

分析
核心观察

设 y = k \cdot x,其中 k 为大于 1 的整数。则任何满足 x \mid z 且 x < z < y 的 z 可写为 z = m \cdot x,其中 1 < m < k。
此时条件 z \nmid y 等价于 m \nmid k。因此问题变为:是否存在整数 m(1 < m < k)使得 m 不整除 k。

思路

若 k = 2,则不存在整数 m 满足 1 < m < 2,因此无解。
若 k > 2,取 m = k - 1。因为 k \ge 3,所以 1 < k-1 < k 成立。同时 k \bmod (k-1) = 1 \ne 0,所以 k-1 \nmid k。
对应取 z = (k-1) \cdot x = y - x,则 z 位于 x 与 y 之间且能被 x 整除,且 y \bmod z = y \bmod (y-x) = x \ne 0(因为 y = kx,z = (k-1)x,y - z = x)。
因此除 k = 2 外均有解,只需判断 y = 2x 是否成立。

具体示例

样例 (1,2):k=2,无解,输出 NO。
样例 (1,3):k=3>2,取 z=2,2 \mid 3?不整除,满足,输出 YES。
样例 (2,8):k=4>2,取 z=6,2 \mid 6,8 \bmod 6 = 2 \ne 0,满足,输出 YES。

算法步骤
  1. 读入测试用例数 t。
  2. 对于每组数据,读入 x 和 y。
  3. 若 y == 2 * x,输出 "NO";否则输出 "YES"。
复杂度分析
  • 时间复杂度:O(t)。
  • 空间复杂度:O(1)。
实现注意事项
  • x, y 最大可达 10^{18},计算 2 \times x 时不会溢出 64 位有符号整数(最大 2 \times 10^{18} < 9.22 \times 10^{18}),使用 long long 安全。
  • 比较时直接使用 y == 2 * x 即可,无需除法避免精度问题。
  • 输出大小写不敏感,统一输出大写。
源代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        long long x, y;
        cin >> x >> y;
        if (y == 2 * x) {
            cout << "NO\n";
        } else {
            cout << "YES\n";
        }
    }
    return 0;
}
import sys

def main():
    data = sys.stdin.buffer.read().split()
    if not data:
        return
    t = int(data[0])
    out = []
    idx = 1
    for _ in range(t):
        x = int(data[idx]); y = int(data[idx + 1])
        idx += 2
        if y == 2 * x:
            out.append("NO")
        else:
            out.append("YES")
    sys.stdout.write("\n".join(out))

if __name__ == "__main__":
    main()

评论

目前没有评论。