#include <bits/stdc++.h>
using namespace std;
const long long int MOD = 1000000007;
const long long int MAX_N = 500010;
const long long int INF = 999999999999;
map<pair<long long int, long long int>, long long int> mp;
map<pair<long long int, long long int>, bool> used;
long long int gcd(long long int a, long long int b) {
  long long int M = max(a, b);
  long long int m = min(a, b);
  if (m == 0) {
    return M;
  }
  return gcd(m, M % m);
}
long long int modpow(long long int a, long long int n, long long int mod) {
  long long int ret = 1;
  while (n > 0) {
    if (n & 1) ret = ret * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return ret;
}
int main() {
  int n;
  cin >> n;
  long long int zero = 0;
  for (int i = 0; i < n; i++) {
    long long int a, b;
    cin >> a >> b;
    if (a == 0 && b == 0) {
      zero++;
      continue;
    }
    long long int g = gcd(abs(a), abs(b));
    a /= g;
    b /= g;
    if (a >= 0 && b <= 0) {
      mp[pair<long long int, long long int>(-a, -b)]++;
    } else if (a <= 0 && b <= 0) {
      mp[pair<long long int, long long int>(-a, -b)]++;
    } else {
      mp[pair<long long int, long long int>(a, b)]++;
    }
  }
  long long int ans = 1;
  for (auto p : mp) {
    pair<long long int, long long int> key = p.first;
    if (!used[pair<long long int, long long int>(key.first, key.second)]) {
      if (key.first >= 0 && key.second >= 0) {
        ans *=
            modpow(2, p.second, MOD) +
            modpow(
                2,
                mp[pair<long long int, long long int>(-key.second, key.first)],
                MOD) -
            1;
        ans %= MOD;
        used[pair<long long int, long long int>(key.first, key.second)] = true;
        used[pair<long long int, long long int>(-key.second, key.first)] = true;
      } else {
        ans *=
            modpow(2, p.second, MOD) +
            modpow(
                2,
                mp[pair<long long int, long long int>(key.second, -key.first)],
                MOD) -
            1;
        ans %= MOD;
        used[pair<long long int, long long int>(key.first, key.second)] = true;
        used[pair<long long int, long long int>(key.second, -key.first)] = true;
      }
    }
  }
  ans += zero;
  ans--;
  cout << ans << endl;
}
