#!/usr/bin/env python3
from collections import defaultdict, Counter
from itertools import product, groupby, count, permutations, combinations
from math import pi, sqrt
from collections import deque
from bisect import bisect, bisect_left, bisect_right
from string import ascii_lowercase
from functools import lru_cache
from fractions import Fraction
import sys
sys.setrecursionlimit(10000)
INF = float("inf")
YES, Yes, yes, NO, No, no = "YES", "Yes", "yes", "NO", "No", "no"
dy4, dx4 = [0, 1, 0, -1], [1, 0, -1, 0]
dy8, dx8 = [0, -1, 0, 1, 1, -1, -1, 1], [1, 0, -1, 0, 1, 1, -1, -1]


def inside(y, x, H, W):
    return 0 <= y < H and 0 <= x < W


def ceil(a, b):
    return (a + b - 1) // b


def sum_of_arithmetic_progression(s, d, n):
    return n * (2 * s + (n - 1) * d) // 2


def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)


def lcm(a, b):
    g = gcd(a, b)
    return a / g * b


MOD = 1000000007


def func(v):
    ans = 1
    # 単独
    for i in range(4):
        ans += pow(2, v[i], MOD) - 1
        ans %= MOD

    # 0と3
    if v[0] and v[3]:
        ans += (v[0] * v[3]) * pow(2, (v[0] + v[3] - 2), MOD)

    # 1と2
    if v[1] and v[2]:
        ans += (v[1] * v[2]) * pow(2, (v[1] + v[2] - 2), MOD)

    return ans % MOD


def solve():
    N = int(input())

    num_zero = 0

    d = defaultdict(list)
    for _ in range(N):
        A, B = map(int, input().split())
        if A == 0 and B == 0:
            num_zero += 1
        else:
            g = gcd(abs(A), abs(B))
            if A == 0:
                k = (0, INF)
            elif B == 0:
                k = (INF, 0)
            elif A > 0 and B > 0:
                k = (A // g, B // g)
            elif A > 0 and B < 0:
                k = (-B // g, A // g)
            elif A < 0 and B > 0:
                k = (B // g, -A // g)
            else:
                k = (-A // g, -B // g)

            if len(d[k]) == 0:
                d[k] = [0, 0, 0, 0]

            if A == 0:
                d[k][0] += 1
            elif B == 0:
                d[k][0] += 1
            if A > 0 and B > 0:
                d[k][0] += 1
            elif A > 0 and B < 0:
                d[k][1] += 1
            elif A < 0 and B > 0:
                d[k][2] += 1
            else:
                d[k][3] += 1

    ans = 1
    for k, v in d.items():
        ans *= func(v)
        ans %= MOD

    print((ans + num_zero + MOD - 1) % MOD)


def main():
    solve()


if __name__ == '__main__':
    main()
