import sys

import math

from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

from collections import deque

from bisect import bisect_left

from itertools import product

def I(): return int(sys.stdin.readline())

def MI(): return list(map(int, sys.stdin.readline().split()))

def LI(): return list(map(int, sys.stdin.readline().split()))

def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]

#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる

def LSI(): return list(map(int, list(sys.stdin.readline().rstrip())))

def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]

#文字列として取得

def ST(): return sys.stdin.readline().rstrip()

def LST(): return sys.stdin.readline().rstrip().split()

def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)]

def FILL(i,h): return [i for j in range(h)]

def FILL2(i,h,w): return [FILL(i,w) for j in range(h)]

def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)]

def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)]

def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)

#'0.01'や'1E1'などで指定、整数に戻すならintをかます

MOD = 1000000007

INF = float("inf")

sys.setrecursionlimit(10**6+10)



from fractions import Fraction



N = I()

cnt = {}

pair = {}

bothzero = 0

for i in range(N):

    A,B = MI()

    if A==0 and B==0:

        bothzero += 1

    elif B==0:

        pair[0]=pair.get(0,0)+1

    elif A == 0:

        cnt[0]=cnt.get(0,0)+1

    elif A/B>0:

        frac = Fraction(A,B).as_integer_ratio()

        

        cnt[frac]=cnt.get(frac,0)+1

    else:

        frac = Fraction(-B,A).as_integer_ratio()

        pair[frac]=pair.get(frac,0)+1

    

res = N-bothzero

ans = 1

for v in cnt:

    if pair.get(v,0)==0:

        continue

    res -= (cnt[v]+pair[v])

    ans = ans*((pow(2,cnt[v],MOD)+pow(2,pair[v],MOD)-1)%MOD)

    ans = ans%MOD

ans = (ans*pow(2,res,MOD)-1)%MOD

ans = (ans+bothzero)%MOD

print(ans)



import sys

import math

from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

from collections import deque

from bisect import bisect_left

from itertools import product

def I(): return int(sys.stdin.readline())

def MI(): return list(map(int, sys.stdin.readline().split()))

def LI(): return list(map(int, sys.stdin.readline().split()))

def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]

#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる

def LSI(): return list(map(int, list(sys.stdin.readline().rstrip())))

def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]

#文字列として取得

def ST(): return sys.stdin.readline().rstrip()

def LST(): return sys.stdin.readline().rstrip().split()

def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)]

def FILL(i,h): return [i for j in range(h)]

def FILL2(i,h,w): return [FILL(i,w) for j in range(h)]

def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)]

def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)]

def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)

#'0.01'や'1E1'などで指定、整数に戻すならintをかます

MOD = 1000000007

INF = float("inf")

sys.setrecursionlimit(10**6+10)





def to_frac(A,B):

    g = math.gcd(A,B)

    A = A//g

    B = B//g

    if A<0:

        A *= -1

        B *= -1



    return (A,B)

N = I()

cnt = {}

pair = {}

bothzero = 0

for i in range(N):

    A,B = MI()

    if A==0 and B==0:

        bothzero += 1

    elif B==0:

        pair[0]=pair.get(0,0)+1

    elif A == 0:

        cnt[0]=cnt.get(0,0)+1

    elif A/B>0:

        frac = to_frac(A,B)

        cnt[frac]=cnt.get(frac,0)+1

    else:

        frac = to_frac(-B,A)

        pair[frac]=pair.get(frac,0)+1

res = N-bothzero

ans = 1

for v in cnt:

    if pair.get(v,0)==0:

        continue

    res -= (cnt[v]+pair[v])

    ans = ans*((pow(2,cnt[v],MOD)+pow(2,pair[v],MOD)-1)%MOD)

    ans = ans%MOD

ans = (ans*pow(2,res,MOD)-1)%MOD

ans = (ans+bothzero)%MOD

print(ans)

import sys
import math
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
from collections import deque
from bisect import bisect_left
from itertools import product


def I():
    return int(sys.stdin.readline())


def MI():
    return list(map(int, sys.stdin.readline().split()))


def LI():
    return list(map(int, sys.stdin.readline().split()))


def LI2(N):
    return [list(map(int, sys.stdin.readline().split())) for i in range(N)]


# 文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる
def LSI():
    return list(map(int, list(sys.stdin.readline().rstrip())))


def LSI2(N):
    return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]


# 文字列として取得
def ST():
    return sys.stdin.readline().rstrip()


def LST():
    return sys.stdin.readline().rstrip().split()


def LST2(N):
    return [sys.stdin.readline().rstrip().split() for i in range(N)]


def FILL(i, h):
    return [i for j in range(h)]


def FILL2(i, h, w):
    return [FILL(i, w) for j in range(h)]


def FILL3(i, h, w, d):
    return [FILL2(i, w, d) for j in range(h)]


def FILL4(i, h, w, d, d2):
    return [FILL3(i, w, d, d2) for j in range(h)]


def sisha(num, digit):
    return Decimal(str(num)).quantize(Decimal(digit), rounding=ROUND_HALF_UP)


#'0.01'や'1E1'などで指定、整数に戻すならintをかます
MOD = 1000000007
INF = float("inf")
sys.setrecursionlimit(10**6 + 10)
from fractions import Fraction

N = I()
cnt = {}
pair = {}
bothzero = 0
for i in range(N):
    A, B = MI()
    if A == 0 and B == 0:
        bothzero += 1
    elif B == 0:
        pair[0] = pair.get(0, 0) + 1
    elif A == 0:
        cnt[0] = cnt.get(0, 0) + 1
    elif A / B > 0:
        frac = Fraction(A, B).as_integer_ratio()
        cnt[frac] = cnt.get(frac, 0) + 1
    else:
        frac = Fraction(-B, A).as_integer_ratio()
        pair[frac] = pair.get(frac, 0) + 1
res = N - bothzero
ans = 1
for v in cnt:
    if pair.get(v, 0) == 0:
        continue
    res -= cnt[v] + pair[v]
    ans = ans * ((pow(2, cnt[v], MOD) + pow(2, pair[v], MOD) - 1) % MOD)
    ans = ans % MOD
ans = (ans * pow(2, res, MOD) - 1) % MOD
ans = (ans + bothzero) % MOD
print(ans)

import sys
import math
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
from collections import deque
from bisect import bisect_left
from itertools import product


def I():
    return int(sys.stdin.readline())


def MI():
    return list(map(int, sys.stdin.readline().split()))


def LI():
    return list(map(int, sys.stdin.readline().split()))


def LI2(N):
    return [list(map(int, sys.stdin.readline().split())) for i in range(N)]


# 文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる
def LSI():
    return list(map(int, list(sys.stdin.readline().rstrip())))


def LSI2(N):
    return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]


# 文字列として取得
def ST():
    return sys.stdin.readline().rstrip()


def LST():
    return sys.stdin.readline().rstrip().split()


def LST2(N):
    return [sys.stdin.readline().rstrip().split() for i in range(N)]


def FILL(i, h):
    return [i for j in range(h)]


def FILL2(i, h, w):
    return [FILL(i, w) for j in range(h)]


def FILL3(i, h, w, d):
    return [FILL2(i, w, d) for j in range(h)]


def FILL4(i, h, w, d, d2):
    return [FILL3(i, w, d, d2) for j in range(h)]


def sisha(num, digit):
    return Decimal(str(num)).quantize(Decimal(digit), rounding=ROUND_HALF_UP)


#'0.01'や'1E1'などで指定、整数に戻すならintをかます
MOD = 1000000007
INF = float("inf")
sys.setrecursionlimit(10**6 + 10)


def to_frac(A, B):
    g = math.gcd(A, B)
    A = A // g
    B = B // g
    if A < 0:
        A *= -1
        B *= -1
    return (A, B)


N = I()
cnt = {}
pair = {}
bothzero = 0
for i in range(N):
    A, B = MI()
    if A == 0 and B == 0:
        bothzero += 1
    elif B == 0:
        pair[0] = pair.get(0, 0) + 1
    elif A == 0:
        cnt[0] = cnt.get(0, 0) + 1
    elif A / B > 0:
        frac = to_frac(A, B)
        cnt[frac] = cnt.get(frac, 0) + 1
    else:
        frac = to_frac(-B, A)
        pair[frac] = pair.get(frac, 0) + 1
res = N - bothzero
ans = 1
for v in cnt:
    if pair.get(v, 0) == 0:
        continue
    res -= cnt[v] + pair[v]
    ans = ans * ((pow(2, cnt[v], MOD) + pow(2, pair[v], MOD) - 1) % MOD)
    ans = ans % MOD
ans = (ans * pow(2, res, MOD) - 1) % MOD
ans = (ans + bothzero) % MOD
print(ans)

-from fractions import Fraction + + +def to_frac(A, B): +    g = math.gcd(A, B) +    A = A // g +    B = B // g +    if A < 0: +        A *= -1 +        B *= -1 +    return (A, B) + -        frac = Fraction(A, B).as_integer_ratio() +        frac = to_frac(A, B) -        frac = Fraction(-B, A).as_integer_ratio() +        frac = to_frac(-B, A)