# Consider sardines as vectors in 2D plane,
# and grouping them by their tangent(B[i] / A[i]).
Mod = 1000000007
N = gets.to_i
zs = 0 # count of zero vectors
X = []
Y = []
(0...N).each{ 
  a,b = gets.split.map &:to_i
  if a == 0 && b == 0
    zs += 1; next
  end

  # limitate arg into [0,pi)
  if b < 0
    a = -a; b = -b;
  end
  if b == 0 && a < 0
    a = -a
  end
  if a > 0
    # arg in [0,pi/2)
    g = b > 0 ? a.gcd(b) : 1
    a /= g; b /= g
    X << b.to_r / a
  else
    # arg in [pi/2,pi)
    # -> rotate -pi/2
    a,b = b,-a
    g = b > 0 ? a.gcd(b) : 1
    a /= g; b /= g
    Y << b.to_r / a
  end
}

xh = {} # count of finite-positive tangents
yh = {} # count of infinite or negative tangents
args = {} # all tangents
X.each{ |arg| args[arg] = 1; xh[arg] = (xh[arg] || 0) + 1 }
Y.each{ |arg| args[arg] = 1; yh[arg] = (yh[arg] || 0) + 1 }

bins = [1] # bins[i] = 2^i
(N+1).times{ bins << ((bins[-1] * 2) % Maod) }

ans = args.keys.reduce(1){ |s,arg|
  x = xh[arg] || 0
  y = yh[arg] || 0
  s = s * (bins[x] + bins[y] - 1)
  s % Mod
} + zs - 1
p ans % Mod
