local mod = 1000000007

local function bmul(x, y)
  return (x * y) % mod
end

local function badd(x, y)
  return (x + y) % mod
end

local function bsub(x, y)
  return x < y and x - y + mod or x - y
end

local function getgcd(x, y)
  while 0 < x do
    x, y = y % x, x
  end
  return y
end

local x1, y1 = {}, {}
local x2, y2 = {}, {}
local xzero = 0
local yzero = 0
local zero = 0

local n = io.read("*n", "*l")
for i = 1, n do
  local a, b = io.read("*n", "*n")
  if a == 0 and b == 0 then
    zero = zero + 1
  elseif a == 0 then
    xzero = xzero + 1
  elseif b == 0 then
    yzero = yzero + 1
  else
    if b < 0 then
      a, b = -a, -b
    end
    if 0 < a then
      local gcd = getgcd(a, b)
      table.insert(x1, a // gcd)
      table.insert(y1, b // gcd)
    else
      local gcd = getgcd(-a, b)
      table.insert(x2, -a // gcd)
      table.insert(y2, b // gcd)
    end
  end
end

local pow2 = {1}
for i = 1, 200010 do
  pow2[i + 1] = (pow2[i] * 2) % mod
end

local ret = badd(pow2[xzero + 1], pow2[yzero + 1])
ret = bsub(ret, 1)

local m1 = {}
for i1 = 1, #x1 do
  local xs, ys = x1[i1], y1[i1]
  if not m1[xs] then m1[xs] = {} end
  if not m1[xs][ys] then
    m1[xs][ys] = 1
  else
    m1[xs][ys] = m1[xs][ys] + 1
  end
end

local m2 = {}
for i2 = 1, #x2 do
  local xs, ys = x2[i2], y2[i2]
  if not m2[ys] then m2[ys] = {} end
  if not m2[ys][xs] then
    m2[ys][xs] = 1
  else
    m2[ys][xs] = m2[ys][xs] + 1
  end
end
for k1, v in pairs(m1) do
  if m2[k1] then
    local m2k1 = m2[k1]
    for k2, c1 in pairs(v) do
      local c2 = m2k1[k2]
      if c2 then
        ret = bmul(ret, bsub(badd(pow2[c1 + 1], pow2[c2 + 1]), 1))
        m2k1[k2] = nil
      else
        ret = bmul(ret, pow2[c1 + 1])
      end
    end
  else
    for k2, c1 in pairs(v) do
      ret = bmul(ret, pow2[c1 + 1])
    end
  end
end
for k1, v in pairs(m2) do
  for k2, c in pairs(v) do
    ret = bmul(ret, pow2[c + 1])
  end
end
ret = bsub(ret, 1)
ret = badd(ret, zero)
print(ret)
