using System;
using System.Linq;
using System.Collections.Generic;
class program{
  static long mod = 1000000007;
  static void Main(){
    int n = int.Parse(Console.ReadLine());
    var ct = new Dictionary<(long, long), int[]>();
    int zeros = 0;
    for(int i = 0; i < n; i++){
      long[] ab = Console.ReadLine().Split().Select(x => long.Parse(x)).ToArray();
      
      if(ab[0] == 0 && ab[1] == 0){
        zeros++;
        continue;
      }
      if(ab[0] == 0) ab[1] = 1;
      else if(ab[1] == 0) ab[0] = -1;
      else{
        if(ab[1] < 0){
          ab[1] = -ab[1];
          ab[0] = -ab[0];
        }
        long absa = ab[0]>0 ? ab[0]:-ab[0];
        long g = absa > ab[1] ? Gcd(absa,ab[1]) : Gcd(ab[1],absa);
        ab[0] /= g;
        ab[1] /= g;
      }
      bool mainus = ab[0] < 0;
      (long, long) key = mainus ? (ab[1], -ab[0]) : (ab[0], ab[1]);
      if (ct.TryGetValue(key, out var v)) v[mainus ? 1 : 0]++;
      else ct.Add(key, mainus ? new[] { 0, 1 } : new[] { 1, 0 });
    }
    long ans = 1;
    foreach (var item in ct.Values) 
      ans *= (ModPow(item[0]) + ModPow(item[1]) - 1) % mod;
    Console.WriteLine((ans + zeros - 1 + mod) % mod);
  }
  static long Gcd(long n,long m) {
        for(int i = 0; i < 10; ++i){
                long t = n - m;
                bool q = m > t;
                n = q ? m : t;
                m = q ? t : m;
                if(m == 0) return n;
        }
        return Gcd(m, n%m);
  }
  static long ModPow(long n)
  {
    long ret = 1;
    long a = 2;
    while (n > 0){
      if (n % 2 == 1) ret = ret * a % mod;
      a = a*a%mod;
      n /= 2;
    }
    return ret;
  }
}