module QuotientMap = Map.Make (struct
  type t = int * int
  let compare (a, b) (c, d) =
    compare (a * d) (b * c) * compare (b * d) 0
end)

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)

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

let () = Scanf.scanf "%d\n" @@ fun n ->
  let abs_ = Array.init n @@ fun _ -> Scanf.scanf "%d %d\n" @@ fun a b -> (a * compare b 0 / gcd (abs a) (abs b), abs b / gcd (abs a) (abs b)) in
  let m =
    Array.fold_left (fun acc (a, b) ->
      QuotientMap.update (a, b) (fun o -> Some (1 + Option.value ~default:0 o)) @@
      QuotientMap.update (b * compare 0 a, abs a) (fun o -> Some (Option.value ~default:0 o)) acc) QuotientMap.empty abs_ in
  Printf.printf "%d\n" @@
  Fun.flip ( -^ ) 1 @@
  QuotientMap.fold (fun (a, b) n -> ( *^ ) @@
    if a * compare b 0 < 0
    then 1
    else let n' = try QuotientMap.find (b * compare 0 a, abs a) m with Not_found -> 0 in (power ( *^ ) 1 2 n +^ power ( *^ ) 1 2 n' -^ 1)) m 1
