#include <bits/stdc++.h>
using namespace std;
long long N, M, H, W, Q, K, A, B;
string S;
const long long MOD = 998244353;
const long long INF = (1LL << 62);
class mint {
 public:
  long long x;
  static unsigned long long mod;
  static unsigned long long mod_plus;
  mint() { x = 0; }
  mint(long long _x)
      : x((_x < 0 ? ((_x += mod_plus) < 0 ? _x + mod_plus : _x) : _x) % mod) {}
  mint operator-() { return x == 0 ? 0 : mod - x; }
  mint& operator+=(const mint& a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  mint operator+(const mint& a) const {
    mint res(*this);
    return res += a;
  }
  mint& operator-=(const mint& a) {
    if ((x -= a.x) < 0) x += mod;
    return *this;
  }
  mint operator-(const mint& a) const {
    mint res(*this);
    return res -= a;
  }
  mint& operator*=(const mint& a) {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator*(const mint& a) const {
    mint res(*this);
    return res *= a;
  }
  mint pow(unsigned long long pw) const {
    mint res(1), comp(*this);
    while (pw) {
      if (pw & 1) res *= comp;
      comp *= comp;
      pw >>= 1;
    }
    return res;
  }
  mint inv() const {
    mint res(*this);
    return res.pow(mod - 2);
  }
  mint& operator/=(const mint& a) {
    (x *= a.inv().x) %= mod;
    return *this;
  }
  mint operator/(const mint& a) const {
    mint res(*this);
    return res /= a;
  }
};
ostream& operator<<(ostream& os, const mint& a) {
  os << a.x;
  return os;
}
unsigned long long mint::mod = int(1e+9) + 7;
unsigned long long mint::mod_plus = (LLONG_MAX / mint::mod) * mint::mod;
long long extgcd(long long a, long long b, long long& x, long long& y) {
  long long d = a;
  if (b != 0) {
    d = extgcd(b, a % b, y, x);
    y -= (a / b) * x;
  } else {
    x = 1;
    y = 0;
  }
  return d;
}
int main() {
  cin >> N;
  vector<long long> a(N), b(N);
  map<pair<long long, long long>, mint> pl, mi;
  mint res(1), last(0);
  for (int i = 0; i < N; i++) {
    cin >> a[i] >> b[i];
    if (a[i] == 0 && b[i] == 0) {
      last += 1;
    } else if (a[i] == 0) {
      pl[pair<long long, long long>(0, 0)] += 1;
    } else if (b[i] == 0) {
      mi[pair<long long, long long>(0, 0)] += 1;
    } else {
      long long x, y;
      bool m = (a[i] < 0) ^ (b[i] < 0);
      a[i] = abs(a[i]);
      b[i] = abs(b[i]);
      long long gcd = extgcd(max(a[i], b[i]), min(a[i], b[i]), x, y);
      a[i] /= gcd;
      b[i] /= gcd;
      m ? mi[pair<long long, long long>(b[i], a[i])] += 1
        : pl[pair<long long, long long>(a[i], b[i])] += 1;
    }
  }
  for (auto v : pl) {
    if (mi[v.first].x == 0)
      res *= 2;
    else {
      mint temp(1), two(2);
      temp += two.pow(v.second.x) - 1;
      temp += two.pow(mi[v.first].x) - 1;
      res *= temp;
    }
  }
  for (auto v : mi) {
    if (pl[v.first].x == 0) res *= 2;
  }
  res += last;
  res -= 1;
  cout << res << endl;
}
