1 条题解

  • 0
    @ 2025-3-3 3:48:31

    解决思路

    本题的核心是计算激光光束在等边三角形内的反射路径总长度。激光从点 PP 出发,沿着平行于 BCBC 的方向传播,并在镜子上反射,直到最终返回激光枪并被吸收。为了计算路径总长度,我们需要分析光束的反射规律,并找到一种数学方法来描述其路径。

    1. 几何分析

      • 等边三角形的边长为 N=2025N=2025,顶点为 AABBCC
      • 激光从 ABAB 边的点 PP 出发,AP=X=224AP = X=224,因此 PB=NX=1801PB = N - X = 1801
      • 光束沿着平行于 BCBC 的方向传播,这意味着它的初始方向与 BCBC 平行。
    2. 反射规律

      • 当光束遇到镜子时,它会按照反射定律反射,即入射角等于反射角。
      • 由于等边三角形的对称性,光束的反射路径会在三角形内形成一系列平行于 BCBC 的线段。
    3. 路径总长度计算

      • 光束的路径可以分解为一系列线段,这些线段的长度与初始线段 PBPB 相关。
      • 通过递归或数学公式,可以计算出所有线段的总长度。

    算法解释

    为了计算光束路径的总长度,我们使用以下算法:

    1. 递归函数 f(a,b)f(a, b)

      • 该函数用于计算光束在反射过程中路径的总长度。
      • 如果 a>ba > b,交换 aabb,确保 aa 是较小的数。
      • 计算 d=b/ad = b / a,即 bb 能被 aa 整除的次数。
      • 如果 bb 能被 aa 整除,则返回 (2×d1)×a(2 \times d - 1) \times a
      • 否则,返回 d×2×a+f(a,b%a)d \times 2 \times a + f(a, b \% a),递归处理余数部分。
    2. 主函数

      • 读取输入 NNXX
      • 调用函数 f(X,NX)f(X, N - X),并将结果与 NN 相加,输出最终结果。

    代码详解

    以下是标准代码的详细解释:

    #include <bits/stdc++.h>
    using namespace std;
    
    long long f(long long a, long long b) {
        if (a > b) swap(a, b); // 确保 a 是较小的数
        long long d = b / a; // 计算 b 能被 a 整除的次数
        if (b % a == 0)
            return (2 * d - 1) * a; // 如果 b 能被 a 整除,返回结果
        return d * 2 * a + f(a, b % a); // 否则,递归处理余数部分
    }
    
    int main() {
        long long n, x;
        cin >> n >> x; // 读取输入 N 和 X
        cout << n + f(x, n - x) << endl; // 计算并输出结果
        return 0;
    }
    
    1. 函数 f(a,b)f(a, b)

      • 该函数通过递归计算光束路径的总长度。
      • 每次递归都会将问题规模缩小,直到 bb 能被 aa 整除。
    2. 主函数

      • 读取输入 NNXX
      • 调用 f(x,nx)f(x, n - x) 计算路径长度,并将结果与 NN 相加,输出最终结果。

    转换代码

    以下是转换为 Java 和 Python 的代码:

    Java 代码

    import java.util.Scanner;
    
    public class Main {
        public static long f(long a, long b) {
            if (a > b) {
                long temp = a;
                a = b;
                b = temp;
            }
            long d = b / a;
            if (b % a == 0)
                return (2 * d - 1) * a;
            return d * 2 * a + f(a, b % a);
        }
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            long n = scanner.nextLong();
            long x = scanner.nextLong();
            System.out.println(n + f(x, n - x));
        }
    }
    

    Python 代码

    def f(a, b):
        if a > b:
            a, b = b, a
        d = b // a
        if b % a == 0:
            return (2 * d - 1) * a
        return d * 2 * a + f(a, b % a)
    
    n, x = map(int, input().split())
    print(n + f(x, n - x))
    
    • 1

    信息

    ID
    287
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    140
    已通过
    5
    上传者