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))