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



京公网安备 11010502036488号