let rec gcd n m =
  if m = 0 then n else gcd m (n mod m)

let m = 1000000007
let ( +^ ) x y = (x + y) mod m
let ( -^ ) x y = x +^ (m - y)
let ( *^ ) x y = (x * y) mod m

let rec power ( * ) e m n =
  if n <= 0 then e
  else power ( * ) (if n land 1 = 0 then e else m * e) (m * m) (n lsr 1)

type quotient = Nan | Zero | Inf | Quotient of int * int

let quotient_of_intpair = function
  | (0, 0) -> Nan
  | (0, 1) -> Zero
  | (1, 0) -> Inf
  | (a, b) ->
      let d = gcd (abs a) (abs b) in
      if b < 0
      then Quotient (~- a / d, ~-b / d)
      else Quotient (a / d, b / d)

let inv = function
  | Zero -> Inf
  | Inf -> Zero
  | Quotient (a, b) -> Quotient (b * compare 0 a, abs a)

module QuotientMap = Map.Make (struct
  type t = quotient
  let compare = compare
end)

let () = Scanf.scanf "%d\n" @@ fun n ->
  let abs = List.init n @@ fun _ -> Scanf.scanf "%d %d\n" @@ fun a b -> quotient_of_intpair (a, b) in
  let zeros, m =
    List.fold_left (fun (zeros, m) -> function
      | Nan -> (zeros + 1, m)
      | q ->
          zeros,
          QuotientMap.update q (fun o -> Some (1 + Option.value ~default:0 o)) @@
          QuotientMap.update (inv q) (fun o -> Some (Option.value ~default:0 o)) m) (0, QuotientMap.empty) abs in
  Printf.printf "%d\n" @@
  ( +^ ) (zeros -^ 1) @@
  QuotientMap.fold (fun q n acc ->
    match q with
    | Zero -> acc
    | Quotient (a, _) when a < 0 -> acc
    | _ ->
        let n' = QuotientMap.find (inv q) m in
        acc *^ (power ( *^ ) 1 2 n +^ power ( *^ ) 1 2 n' -^ 1)) m 1
