#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int mod = 1000000007;
int64 gcd(int64 a, int64 b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int N;
  cin >> N;
  int zeros = 0;
  int zerob = 0;
  int zeroa = 0;
  map<pair<int64, int64>, int> cnt;
  for (int i = 0; i < N; i++) {
    int64 A, B;
    cin >> A >> B;
    if (!A && !B) {
      zeros++;
    } else if (!B) {
      zerob++;
    } else if (!A) {
      zeroa++;
    } else {
      int64 g = gcd(A, B);
      A /= g;
      B /= g;
      if (A < 0) {
        A *= -1;
        B *= -1;
      }
      cnt[{A, B}]++;
    }
  }
  vector<int64> pow2(N + 1);
  pow2[0] = 1;
  for (int i = 1; i <= N; i++) pow2[i] = (pow2[i - 1] * 2) % mod;
  int64 res = 1;
  int64 zero_tot = pow2[zeroa] * pow2[zerob] % mod;
  res *= zero_tot;
  res %= mod;
  map<pair<int64, int64>, bool> used;
  for (auto entry : cnt) {
    int64 A, B;
    tie(A, B) = entry.first;
    if (B > 0) {
      int64 tot = pow2[entry.second];
      int64 X = -B;
      int64 Y = A;
      int64 g = gcd(X, Y);
      X /= g;
      Y /= g;
      if (X < 0) {
        X *= -1;
        Y *= -1;
      }
      if (cnt[{X, Y}]) {
        int64 v2 = pow2[cnt[{X, Y}]];
        tot += v2 - 1;
        tot %= mod;
        res *= tot;
        res %= mod;
        used[{A, B}] = used[{X, Y}] = true;
      }
    }
  }
  int64 rem = 0;
  for (auto entry : cnt) {
    if (!used[entry.first]) {
      rem += entry.second;
    }
  }
  res *= pow2[rem];
  res %= mod;
  res += (zeros ? 1 : 0);
  res += (mod - 1);
  res %= mod;
  cout << res << "\n";
  return 0;
}
