import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int h = scanner.nextInt();

        for (int i = 0; i < n; i++) {
            long x = scanner.nextLong();
            long y = scanner.nextLong();
            long z = scanner.nextLong();

            // 计算镜像点的z坐标:2h - z
            long mirroredZ = 2 * h - z;

            // 方向向量是 (x, y, mirroredZ)
            long a = x;
            long b = y;
            long c = mirroredZ;

            // 计算这三个数的gcd
            long gcd = computeGCD(a, computeGCD(b, c));

            // 简化方向向量
            a /= gcd;
            b /= gcd;
            c /= gcd;

            System.out.println(a + " " + b + " " + c);
        }
    }

    private static long computeGCD(long a, long b) {
        while (b != 0) {
            long temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
}

https://www.nowcoder.com/discuss/727521113110073344

思路

  1. 输入处理:读取需要击中的坐标数量 n 和水面距离 h。
  2. 循环处理每个坐标:对于每个目标点 (x, y, z),计算其相对于水面 z = h 的镜像点 (x, y, 2h - z)。
  3. 方向向量计算:方向向量为从原点指向镜像点的向量 (x, y, 2h - z)。
  4. 简化向量:计算该向量的三个分量的最大公约数,并将各分量除以 gcd 得到最简形式,确保输出满足 gcd(i, j, k) = 1。
  5. 输出结果:打印简化后的方向向量。