#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007;
long long N;
map<pair<long long, long long>, long long> mp;
long long gcd(long long a, long long b) {
  if (a < b) swap(a, b);
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long pow_mod(long long a, long long b) {
  if (b == 0) return 1;
  long long k = pow_mod(a, b / 2);
  k *= k;
  k %= mod;
  if (b % 2 == 0) return k;
  return (k * a) % mod;
}
int main() {
  cin >> N;
  for (int i = 1; i <= N; i++) {
    long long A, B;
    cin >> A >> B;
    long long C = gcd(abs(A), abs(B));
    if (C != 0) {
      A /= C, B /= C;
      if (A == 0) {
        B /= abs(B);
      } else if (B == 0) {
        A /= abs(A);
      }
    }
    mp[make_pair(A, B)]++;
  }
  vector<pair<long long, long long>> v;
  for (auto x : mp) {
    auto p = x.first;
    if (p.first == 0 && p.second == 0) continue;
    auto q = make_pair(-p.second, p.first);
    auto r = make_pair(-q.second, q.first);
    auto s = make_pair(-r.second, r.first);
    auto a = mp[p], b = mp[q], c = mp[r], d = mp[s];
    set<pair<long long, long long>> st;
    if (a) st.insert(p);
    if (b) st.insert(q);
    if (c) st.insert(r);
    if (d) st.insert(s);
    if (*(st.begin()) == p) {
      v.push_back(make_pair(a + c, b + d));
    }
  }
  long long ans = 1;
  for (int i = 0; i < v.size(); i++) {
    ans *= (1 + (pow_mod(2, v[i].first) - 1) + (pow_mod(2, v[i].second) - 1)) %
           mod;
    ans %= mod;
  }
  ans--;
  ans += mod + mod;
  ans %= mod;
  cout << ans << endl;
}
