AtCoder Beginner Contest 226 D - Teleportation【Python】
https://atcoder.jp/contests/abc226/tasks/abc226_d
街に移動する魔法(1, 2)と(2, 4)があるとすると後者は前者を2回繰り返せば良い事に気づきました。 移動元を原点、移動先をそれに合わせて変換し、変換後の移動先の座標(x, y)を(x/abs(x), y/abs(x))としてsetで管理することで解くことができました。
N = int(input()) t = [] m = set() for i in range(N): x, y = map(int, input().split()) t.append([x, y]) for i in range(N): for j in range(N): if i == j: continue x1, y1 = t[i] x2, y2 = t[j] x2, y2 = x2 - x1, y2 - y1 x1, y1 = 0, 0 if x2 == 0: if y2 >= 0: magic = (0, 1) else: magic = (0, -1) elif y2 == 0: if x2 >= 0: magic = (1, 0) else: magic = (-1, 0) else: magic = (x2/abs(x2), y2/abs(x2)) # 解説の実装 # gcd = math.gcd(x2, y2) # magic = (x2/gcd, y2/gcd) m.add(magic) print(len(m))