#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int t;
int n;
long long a[N], b[N];
long long powers[N];
const long long mod = 1e9 + 7;
map<pair<int, int>, long long> cnt;
map<pair<int, int>, bool> ok;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
void solve() {
  cin >> n;
  powers[0] = 1;
  for (int i = 1; i < N; i++) {
    powers[i] = powers[i - 1] * 2;
    powers[i] %= mod;
  }
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    cin >> b[i];
  }
  bool bad = false;
  for (int i = 0; i < n; i++) {
    if (a[i] < 0 and b[i] < 0) {
      a[i] = -a[i];
      b[i] = -b[i];
    }
    if (b[i] < 0) {
      a[i] = -a[i];
      b[i] = -b[i];
    }
    if (a[i] == 0) b[i] = 1;
    if (b[i] == 0) a[i] = 1;
    if (a[i] == 0 || b[i] == 0) {
      if (a[i] == 0 and b[i] == 0) {
        bad = true;
        continue;
      }
      if (a[i] == 0) {
        cnt[{1, 0}]++;
      } else {
        cnt[{1, 0}]++;
      }
    } else {
      long long g = gcd(abs(a[i]), abs(b[i]));
      a[i] /= g;
      b[i] /= g;
      cnt[{a[i], b[i]}]++;
    }
  }
  long long ans = 1;
  for (auto p : cnt) {
    if (ok[p.first]) continue;
    long long mult =
        (powers[p.second] + powers[cnt[{p.first.second, -p.first.first}]] - 1) %
        mod;
    ans = ans * (mult);
    ans %= mod;
    ok[p.first] = true;
    ok[{p.first.second, -p.first.first}] = true;
  }
  ans = ans + mod - 1;
  ans %= mod;
  if (bad) {
    ans = ans + 1;
    ans %= mod;
  }
  cout << ans << endl;
}
int main() {
  t = 1;
  while (t--) {
    solve();
  }
}
