#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long INF = 1LL << 60;
const int INT_INF = 1 << 30;
long long modbeki(long long x, long long n) {
  long long res = 1LL;
  while (n > 0) {
    if (n & 1) {
      res *= x % 1000000007LL;
      res %= 1000000007LL;
    }
    x = x * x % 1000000007LL;
    n >>= 1;
  }
  return res % 1000000007LL;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  long long N;
  cin >> N;
  vector<pair<long double, long double>> p(N);
  vector<pair<long double, long double>> rad(N);
  map<long double, long long> mp;
  for (int i = 0; i < N; i++) {
    cin >> p.at(i).first >> p.at(i).second;
    rad.at(i).first = atan(p.at(i).second / p.at(i).first);
    rad.at(i).second = atan(p.at(i).first / -p.at(i).second);
    if (!mp.count(rad.at(i).first))
      mp[rad.at(i).first] = 1LL;
    else
      mp.at(rad.at(i).first)++;
  }
  long long total = modbeki(2LL, N) - 1;
  long long ans = 1LL;
  long long nnn = int(mp.size());
  for (int i = 0; i < nnn; i++) {
    if (mp.size() == 0) break;
    long double rr = rad.at(i).first;
    long double rr2 = rad.at(i).second;
    if (!mp.count(rr)) continue;
    long long nn = mp.at(rr);
    long long nn2;
    if (mp.count(rr2))
      nn2 = mp.at(rr2);
    else
      nn2 = 0LL;
    if (nn2 != 0)
      ans *= (modbeki(2LL, nn) + modbeki(2LL, nn2) - 1) % 1000000007LL;
    else
      ans *= modbeki(2LL, nn);
    ans %= 1000000007LL;
    mp.erase(rr);
    if (nn2 != 0LL) mp.erase(rr2);
  }
  cout << ans - 1 << "\n";
}
