#include <bits/stdc++.h>
using namespace std;
using pii = pair<long long, long long>;
using vi = vector<long long>;
using vvi = vector<vi>;
const signed INF_ = 1001001001;
const long long INF = 1001001001001001001LL;
const long long DX[9] = {0, 1, 0, -1, 1, 1, -1, -1, 0},
                DY[9] = {-1, 0, 1, 0, -1, 1, 1, -1, 0};
template <class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto i = begin(v); i != end(v); i++)
    os << *i << (i == end(v) - 1 ? "" : " ");
  return os;
}
template <class T>
istream &operator>>(istream &is, vector<T> &v) {
  for (auto i = begin(v); i != end(v); i++) is >> *i;
  return is;
}
template <class T, class U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}
template <class T, class U>
bool chmax(T &a, const U &b) {
  return a < b ? a = b, 1 : 0;
}
template <class T, class U>
bool chmin(T &a, const U &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T>
void psum(T &c) {
  partial_sum(begin(c), end(c), begin(c));
}
template <class T>
using heap = priority_queue<T, deque<T>, greater<T>>;
struct before_main_function {
  before_main_function() {
    cin.tie(nullptr);
    ios::sync_with_stdio(0);
    cout << setprecision(15) << fixed;
  }
} before_main_function;
long long gcd(long long a, long long b) { return a ? gcd(b % a, a) : b; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
signed main() {
  long long N;
  cin >> N;
  vi A(N), B(N);
  for (long long i = 0, ilen = (long long)(N); i < ilen; ++i)
    cin >> A[i] >> B[i];
  map<pii, pii> cnt;
  long long zero = 0;
  for (long long i = 0, ilen = (long long)(N); i < ilen; ++i) {
    long long a = abs(A[i]), b = abs(B[i]);
    if (a == 0 && b == 0) {
      zero++;
    } else if (a == 0) {
      cnt[pii(0, INF)].first++;
    } else if (b == 0) {
      cnt[pii(0, INF)].second++;
    } else {
      long long sign = A[i] / abs(A[i]) * B[i] / abs(B[i]);
      long long g = gcd(a, b);
      a /= g;
      b /= g;
      if (sign > 0) swap(a, b);
      (sign > 0 ? cnt[pii(a, b)].first : cnt[pii(a, b)].second)++;
    }
  }
  long long ans = 0;
  const long long MOD = 1000000007;
  ans += zero;
  long long tmp = 1;
  for (auto &&p : cnt) {
    long long x, y;
    tie(x, y) = p.second;
    tmp *= x * (x + 1) / 2 % MOD + y * (y + 1) / 2 % MOD + 1;
    tmp %= MOD;
  }
  tmp = tmp + MOD - 1;
  ans += tmp;
  ans %= MOD;
  cout << ans << endl;
  return (0 ^ 0 ^ 0);
}
