N=int(input())
from collections import defaultdict
import math
d = defaultdict(int)
MOD=10**9+7
M=0
for i in range(N):
  a,b=map(int,input().split())
  x=math.gcd(abs(a),abs(b))
  if x==0:
    if a>b:
      k=(1,0)
    elif b>a:
      k=(0,1)
    else:
      k=(0,0)
  else:
    if a<0:
      a,b=-a,-b
    if b<0:
      a,b=a//x,-((-b)//x)
    else:
      a,b=a//x,b//x
    k=(a,b)
  d[k]+=1
  M=max(M,d[k])
ans=0
def cmb(n, r, mod):
  if ( r<0 or r>n ):
    return 0
  r = min(r, n-r)
  return g1[n] * g2[r] * g2[n-r] % mod

#N = 10**4
g1 = [1, 1] # 元テーブル
g2 = [1, 1] #逆元テーブル
inverse = [0, 1] #逆元テーブル計算用テーブル
for i in range( 2, M + 1 ):
  g1.append( ( g1[-1] * i ) % MOD )
  inverse.append( ( -inverse[MOD % i] * (MOD//i) ) % MOD )
  g2.append( (g2[-1] * inverse[-1]) % MOD )

def C(x):
  _=0
  for i in range(1,x+1):
    _+=cmb(x,i,MOD)
  return _

if d[(0,0)]>0:
  ans+=d[(0,0)]
ind=defaultdict(int)
index=1
_ans=[1]
for a,b in list(d.keys()):
  if b<0:
    _k=(-b,a)
  else:
    _k=(b,-a)
  if d[_k]==0:
    _ans.append(C(d[(a,b)])+1)
    index+=1
  else:
    if ind[_k]==0:
      _ans.append(C(d[(a,b)]))
      ind[(a,b)]=index
      index+=1
    else:
      _ans[ind[_k]]+=C(d[(a,b)])+1
_=1
for a in _ans:
  _*=a
print((ans+_-1)%MOD)

