题解:洛谷 AT_abc463_a 16:9

【题目来源】

洛谷:AT_abc463_a [ABC463A] 16:9 - 洛谷

【题目描述】

There is an image with a width of \(X\) pixels and a height of \(Y\) pixels. Determine whether the ratio of the width to the height is \(16\) to \(9\), that is, whether \(X:Y=16:9\).

有一张宽度为 \(X\) 像素、高度为 \(Y\) 像素的图片。请判断其宽高比是否为 \(16:9\),即是否满足 \(X:Y = 16:9\)

【输入】

The input is given from Standard Input in the following format:

\(X\) \(Y\)

【输出】

If the ratio of the width to the height is \(16\) to \(9\), output Yes; otherwise, output No.

【输入样例】

800 450

【输出样例】

Yes

【核心思想】

  1. 问题分析:给定图片宽度 \(X\) 和高度 \(Y\),需要判断宽高比是否为 \(16:9\)。即是否存在正整数 \(k\),使得 \(X = 16k\)\(Y = 9k\)。等价于判断 \(\frac{X}{\gcd(X,Y)} = 16\)\(\frac{Y}{\gcd(X,Y)} = 9\)

  2. 算法选择

    • 欧几里得算法(辗转相除法):计算 \(X\)\(Y\) 的最大公约数 \(g = \gcd(X,Y)\)
    • 比例化简判定:将 \(X\)\(Y\) 同时除以 \(g\) 得到最简比,检查是否等于 \(16:9\)
  3. 关键步骤

    • 读取输入\(X\)(宽度)、\(Y\)(高度)
    • 计算 \(\gcd\)\(t = \gcd(X, Y)\)
    • 判定比例
      • \(16 \times t = X\)\(9 \times t = Y\),输出 Yes
      • 否则输出 No
    • 等价于检查 \(\frac{X}{t} = 16\)\(\frac{Y}{t} = 9\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\log \min(X, Y))\),辗转相除法的复杂度
    • 空间复杂度:\(O(1)\),仅使用常数个变量
  5. 欧几里得算法判定比例的核心思想

    • 最简比唯一性:任意两个正整数的比可以唯一表示为最简分数形式,通过 \(\gcd\) 约分后得到。若最简比等于 \(16:9\),则原比必为 \(16:9\) 的某个整数倍
    • 避免浮点误差:不直接计算 \(\frac{X}{Y}\) 并与 \(\frac{16}{9}\) 比较(可能产生浮点精度问题),而是利用整数运算和 \(\gcd\) 进行精确判定
    • 等价变形技巧\(X:Y = 16:9 \Leftrightarrow 9X = 16Y\),也可通过交叉相乘判定,但 \(\gcd\) 方法同时适用于更复杂的比例验证场景
    • 辗转相除的高效性:欧几里得算法通过取模运算快速缩小问题规模,时间复杂度为对数级别,远优于枚举
    • 适用于比例判定、分数化简、有理数比较等基础数论问题

【算法标签】

入门 #欧几里得算法

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int x, y;                       // x: 图片宽度, y: 图片高度

// 辗转相除法求最大公约数(GCD)
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

int main()
{
    cin >> x >> y;              // 读入图片的宽度和高度

    int t = gcd(x, y);          // 计算 x 和 y 的最大公约数

    // 判断化简后的比例是否为 16:9
    // 若 x:y = 16:9,则 x = 16*k, y = 9*k(k 为某个正整数)
    // 即 x/gcd(x,y) = 16 且 y/gcd(x,y) = 9
    // 等价于 16*t == x 且 9*t == y(其中 t = gcd(x,y))
    if (16 * t == x && 9 * t == y)
        cout << "Yes" << endl;  // 宽高比为 16:9
    else
        cout << "No" << endl;   // 宽高比不为 16:9

    return 0;
}

【运行结果】

800 450
Yes
posted @ 2026-07-01 21:37  团爸讲算法  阅读(14)  评论(0)    收藏  举报