#include <bits/stdc++.h>
using namespace std;
const long long INF = 1LL << 60;
const long long MOD = 1000000007;
const long long MAX_N = 200100;
long long powmod(long long a) {
  long long t = 1;
  for (long long i = 0; i < a; i++) {
    t *= 2;
    t %= MOD;
  }
  return t;
}
long long GCD(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return GCD(b, a % b);
}
signed main() {
  long long N;
  cin >> N;
  map<string, pair<long long, long long>> m;
  long long zeroxy = 0;
  long long zerox = 0;
  long long zeroy = 0;
  for (long long i = 0; i < N; i++) {
    long long a, b;
    cin >> a >> b;
    if (a == 0 && b == 0)
      zeroxy++;
    else if (b == 0)
      zeroy++;
    else if (a == 0)
      zerox++;
    else {
      long long t = GCD(a, b);
      a /= t;
      b /= t;
      if (a > 0 && b > 0)
        m[to_string(a) + ' ' + to_string(b)].first++;
      else if (a < 0 && b < 0)
        m[to_string(-a) + ' ' + to_string(-b)].first++;
      else if (a < 0 && b > 0)
        m[to_string(b) + ' ' + to_string(-a)].second++;
      else if (a > 0 && b < 0)
        m[to_string(-b) + ' ' + to_string(a)].second++;
    }
  }
  m["zero"].first = zerox;
  m["zero"].second = zeroy;
  long long ans = 1;
  for (auto iter = m.begin(); iter != m.end(); iter++) {
    long long tmp = 1;
    string s = iter->first;
    long long a = m[s].first;
    long long b = m[s].second;
    tmp += powmod(a) - 1;
    tmp %= MOD;
    tmp += powmod(b) - 1;
    tmp %= MOD;
    ans *= tmp;
    ans %= MOD;
  }
  ans -= 1;
  cout << ans + zeroxy << endl;
  return 0;
}
