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。
- 输出结果:打印简化后的方向向量。