local mod = 1000000007
local mfl = math.floor

local function bmul(x, y)
  local x1, y1 = mfl(x / 31623), mfl(y / 31623)
  local x0, y0 = x - x1 * 31623, y - y1 * 31623
  return (x1 * y1 * 14122 + (x1 * y0 + x0 * y1) * 31623 + x0 * y0) % 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 modpow(src, pow)
  local res = 1
  while 0 < pow do
    if pow % 2 == 1 then
      res = bmul(res, src)
      pow = pow - 1
    end
    src = bmul(src, src)
    pow = mfl(pow / 2)
  end
  return res
end

local function modinv(src)
  return modpow(src, mod - 2)
end

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

local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
long long atoll(const char*);
]]

local function lltonumber(str)
  return C.atoll(str)
end

local n = io.read("*n", "*l")
local a, b = {}, {}
for i = 1, n do
  local s = io.read()
  local ai, bi = s:match("(%-?%d+) (%-?%d+)")
  a[i] = lltonumber(ai)
  b[i] = lltonumber(bi)
end

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

for i = 1, n do
  if a[i] == 0LL and b[i] == 0LL then
    -- no use
  elseif a[i] == 0LL then
    xzero = xzero + 1
  elseif b[i] == 0LL then
    yzero = yzero + 1
  else
    if b[i] < 0LL then
      a[i], b[i] = -a[i], -b[i]
    end
    if 0LL < a[i] then
      local xi = a[i]
      local yi = b[i]
      local gcd = getgcd(xi, yi)
      table.insert(x1, xi / gcd)
      table.insert(y1, yi / gcd)
    else
      local xi = -a[i]
      local yi = b[i]
      local gcd = getgcd(xi, yi)
      table.insert(x2, xi / gcd)
      table.insert(y2, yi / gcd)
    end
  end
end
-- local idx1 = {}
-- for i = 1, #x1 do
--   idx1[i] = i
-- end
-- local idx2 = {}
-- for i = 1, #x2 do
--   idx2[i] = i
-- end
-- table.sort(idx1, function(aa, bb)
--   if x1[aa] ~= x1[bb] then
--     return x1[aa] < x1[bb]
--   else
--     return y1[aa] < y1[bb]
--   end
-- end)
--
-- table.sort(idx2, function(aa, bb)
--   if y2[aa] ~= y2[bb] then
--     return y2[aa] < y2[bb]
--   else
--     return x2[aa] < x2[bb]
--   end
-- end)

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

local ret = badd(pow2[xzero + 1] - 1, pow2[yzero + 1] - 1)
ret = (ret + 1) % mod

local m1 = {}
for i1 = 1, #x1 do
  local xs, ys = tostring(x1[i1]), tostring(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 = tostring(x2[i2]), tostring(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
        local val = pow2[c1 + c2 + 1]
        local rm = bmul(pow2[c1 + 1] - 1, pow2[c2 + 1] - 1)
        ret = bmul(ret, bsub(val, rm))
        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

print(bsub(ret, 1))
