#include <bits/stdc++.h>
using namespace std;
void print(vector<pair<int, int> > X) {
  for (int i = 0; i < X.size(); i++) {
    cout << X[i].first << " " << X[i].second << endl;
  }
  return;
}
long long int gcd(long long int x, long long int y) {
  if (y == 0 || y == x) {
    return x;
  }
  if (x == 0) {
    return y;
  }
  if (y > x) {
    long long int r = x;
    x = y;
    y = r;
  }
  return gcd(y, x % y);
}
int sigma(pair<long long int, long long int> u) {
  if (u.first > 0 && u.second > 0) {
    return 1;
  }
  if (u.first < 0 && u.second < 0) {
    return 1;
  }
  return -1;
}
long long int laip(long long int a, long long int b, long long int liek) {
  if (b == 0) {
    return 1;
  }
  a = a % liek;
  if (b == 1) {
    return a;
  }
  long long int x = laip((a * a) % liek, b / 2, liek);
  if (b % 2 == 0) {
    return x;
  }
  return (a * x) % liek;
}
long long int solve(vector<pair<int, int> > &X, long long int liek) {
  long long int ats = 1;
  for (int i = 0; i < (int)X.size(); i++) {
    pair<int, int> u = X[i];
    if (u.first == 0) {
      ats = ats * laip(2, u.second, liek);
      ats = ats % liek;
    }
    if (u.second == 0) {
      ats = ats * laip(2, u.first, liek);
      ats = ats % liek;
    }
    if (u.first > 0 && u.second > 0) {
      long long int v = laip(2, u.second, liek) + laip(2, u.first, liek) - 1;
      v = (v + liek) % liek;
      ats = ats * v;
      ats = ats % liek;
    }
  }
  return ats;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  vector<pair<long long int, long long int> > A;
  for (int i = 0; i < n; i++) {
    long long int a, b;
    cin >> a >> b;
    if (a != 0 || b != 0) {
      long long int x = gcd(abs(a), abs(b));
      if (b < 0) {
        a = -a;
        b = -b;
      }
      A.push_back({a / x, b / x});
    }
  }
  map<pair<long long int, long long int>, pair<int, int> > M;
  for (int i = 0; i < (int)A.size(); i++) {
    pair<long long int, long long int> u = A[i];
    if (u.first != 0 && u.second != 0) {
      int a = sigma(u);
      if (a == 1) {
        if (M.find(u) != M.end()) {
          M[u].first++;
        } else {
          M[u] = {1, 0};
        }
      } else {
        pair<long long int, long long int> v = {abs(u.second), abs(u.first)};
        if (M.find(v) != M.end()) {
          M[v].second++;
        } else {
          M[v] = {0, 1};
        }
      }
    } else {
      pair<long long int, long long int> s = {0, 1};
      if (u.first == 0) {
        if (M.find(s) != M.end()) {
          M[s].first++;
        } else {
          M[s] = {1, 0};
        }
      } else {
        if (M.find(s) != M.end()) {
          M[s].second++;
        } else {
          M[s] = {0, 1};
        }
      }
    }
  }
  vector<pair<int, int> > X;
  for (auto f : M) {
    X.push_back(f.second);
  }
  long long int liek = 1000000007;
  long long int ats = (solve(X, liek) - 1 + liek) % liek;
  cout << ats << endl;
  return 0;
}
