import sys
import math
from collections import Counter

mod = 1000000007
 
N = int(sys.stdin.readline().strip())
fishes = []
zero = 0
zero_l = 0
zero_r = 0
rest = N
for _ in range(N):
    a, b = map(int, sys.stdin.readline().strip().split())
    # 角度だけが重要なので座標圧縮して良い
    if a == 0 and b == 0:
        # fishes.append((0, 0))
        zero += 1
        rest -= 1
    elif a == 0:
        # fishes.append((0, 1))
        zero_l += 1
    elif b == 0:
        # fishes.append((1, 0))
        zero_r += 1
    else:
        gcd = math.gcd(a, b)
        fishes.append((a // gcd, b // gcd))

# print(fishes)

# (a, b)ごとにカウント
counter = Counter(fishes)
# print(counter)

calculated = set()
ans = 1
# 組み合わせを計算
for ((a, b), count) in counter.items():
    # if a == 0 or b == 0:
    #     continue
    # 計算済みの場合
    if (a, b) in calculated:
        continue

    # 仲が悪いイワシの数
    bad_count = 0
    # 90度異なるものがダメ
    for (a_k, b_k) in ((-1, 1), (1, -1)):
        bad_pair = (b * a_k, a * b_k)
        if bad_pair in counter:
            bad_count += counter[bad_pair]
            calculated.add(bad_pair)

    if bad_count != 0:
        # good か bad からしか選ばないものは駄目
        ans *= pow(2, count + bad_count, mod) - (pow(2, count, mod) - 1) * (pow(2, bad_count, mod) - 1) 
        ans %= mod

        rest -= count + bad_count

# どちらかが0になっているもの
ans *= pow(2, zero_r + zero_l, mod) - (pow(2, zero_l, mod) - 1) * (pow(2, zero_r, mod) - 1)
ans %= mod
rest -= zero_r + zero_l

# 仲が悪いものが存在しないイワシの組み合わせ
ans *= pow(2, rest, mod)

# 全部選ばないものは駄目
ans += zero - 1
ans %= mod

print(ans)