import bisect
import copy
import heapq
import sys
import itertools
import math
import queue
input = sys.stdin.readline
sys.setrecursionlimit(1000000)
mod = 10 ** 9 + 7

def read_values(): return map(int, input().split())
def read_index(): return map(lambda x: int(x) - 1, input().split())
def read_list(): return list(read_values())
def read_lists(N): return [read_list() for n in range(N)]
def init_dp1(init, N): return [init for _ in range(N)]
def init_dp2(init, N, M): return [[init for _ in range(M)] for _ in range(N)]


def main():
    N = int(input())
    A = read_lists(N)    

    K = {}
    for a in A:
        if a[0] == 0:
            r = "I"
        else:
            r = a[1] / a[0]
        K[r] = K.setdefault(r, 0) + 1

    S = set()
    res = 1
    for k, v in K.items():
        if k in S:
            continue
        S.add(k)

        t = 0 if k == "I" else "I" if k == 0 else -1 / k

        if t in K:
            S.add(t)
            v2 = K[t]
            res *= (pow(2, v, mod) + pow(2, v2, mod) - 1)
            res %= mod
        else:
            res *= 2
            res %= mod

    print((res - 1) % mod)


if __name__ == "__main__":
    main()

