require 'set'

n = gets.to_i

# 内積が0なので、直交してると仲が悪いということ。
# b/aでグループ分けできる。(a=0のときはinf）
# -> 既約にして[a,b]でもいい

count = Hash.new(0)
count_0_0 = 0 # [0, 0]だけ特別
n.times do
  a, b = gets.split.map(&:to_i)
  if a == 0 && b == 0
    count_0_0 += 1
  else
    # aは0以上に限定する
    if a < 0
      a = - a
      b = - b
    end
    gcd = a.gcd(b)
    a_ = a / gcd
    b_ = b / gcd
    count[[a_, b_]] += 1
  end
end

total = 1
opp_set = Set.new
count.each do |(a, b), k|
  next if opp_set.include?([a, b])
  opp_group = (b >= 0) ? [b, -a] : [-b, a]
  opp_set.add(opp_group)
  opp_k = count[opp_group]
  inner = 2**k + 2**opp_k - 1
  total *= inner
end

# 1つも選ばないのを除く
total -= 1

# 0_0だけ選ぶケース（1つしか選べない）
total += count_0_0

puts total % 1000000007
