#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
ll mod = 1000000007;
ll rep_square(ll a, ll b) {
  ll ans = 1;
  ll base = a;
  while (b != 0) {
    if (b & 1) {
      ans *= base;
      ans %= mod;
    }
    base *= base;
    base %= mod;
    b >>= 1;
  }
  return ans;
}
ll gcd(ll a, ll b) {
  if (b == 0) {
    return a;
  }
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a * b / gcd(a, b); }
int main() {
source:
  ll n;
  cin >> n;
  ll a[n], b[n];
  ll zero_zero = 0;
  map<pair<ll, ll>, ll> map0, map1;
  for (ll i = (0); i < (n); i++) {
    cin >> a[i] >> b[i];
    if (a[i] == 0 && b[i] == 0) {
      zero_zero++;
      continue;
    } else if (a[i] == 0) {
      b[i] = 1;
      map1[make_pair(1, 0)]++;
      continue;
    } else if (b[i] == 0) {
      a[i] = 1;
      map0[make_pair(1, 0)]++;
      continue;
    }
    if (a[i] > 0 && b[i] > 0) {
      ll g = gcd(a[i], b[i]);
      a[i] /= g;
      b[i] /= g;
      map0[make_pair(a[i], b[i])]++;
    } else if (a[i] < 0 && b[i] < 0) {
      a[i] = -a[i];
      b[i] = -b[i];
      ll g = gcd(a[i], b[i]);
      a[i] /= g;
      b[i] /= g;
      map0[make_pair(a[i], b[i])]++;
    } else if (a[i] > 0 && b[i] < 0) {
      b[i] = -b[i];
      swap(a[i], b[i]);
      ll g = gcd(a[i], b[i]);
      a[i] /= g;
      b[i] /= g;
      map1[make_pair(a[i], b[i])]++;
    } else if (a[i] < 0 && b[i] > 0) {
      a[i] = -a[i];
      swap(a[i], b[i]);
      ll g = gcd(a[i], b[i]);
      a[i] /= g;
      b[i] /= g;
      map1[make_pair(a[i], b[i])]++;
    }
  }
  ll num = n - zero_zero;
  map<pair<ll, ll>, pair<ll, ll>> map_all;
  for (auto iter = map0.begin(); iter != map0.end(); iter++) {
    map_all[iter->first].first += iter->second;
  }
  for (auto iter = map1.begin(); iter != map1.end(); iter++) {
    map_all[iter->first].second += iter->second;
  }
  ll ans = 1;
  for (auto iter = map_all.begin(); iter != map_all.end(); iter++) {
    auto x = iter->first;
    auto y = iter->second;
    ll num0 = y.first, num1 = y.second;
    ll temp = (rep_square(2, num0) + rep_square(2, num1) - 1 + 3 * mod) % mod;
    if (temp <= 0) {
      throw runtime_error("e");
    }
    ans = (ans * temp) % mod;
  }
  ans--;
  ans += zero_zero;
  cout << ans << endl;
}
