#include <bits/stdc++.h>
using namespace std;
int pow(long long a, long long b) {
  if (b == 0)
    return 1;
  else
    return pow(a * a % 1000000007, b / 2) * (b % 2 == 0 ? 1 : a) % 1000000007;
}
int main() {
  int N;
  cin >> N;
  map<int, int> C, D;
  vector<int> c, d;
  int i;
  long long a, b;
  for (i = 0; i < N; i++) {
    cin >> a >> b;
    if (a * b > 0) {
      C[(abs(a) % 1000000007) * pow(abs(b) % 1000000007, 1000000005) %
        1000000007]++;
      if (C[(abs(a) % 1000000007) * pow(abs(b) % 1000000007, 1000000005) %
            1000000007] == 1)
        c.push_back((abs(a) % 1000000007) *
                    pow(abs(b) % 1000000007, 1000000005) % 1000000007);
    } else {
      D[(abs(a) % 1000000007) * pow(abs(b) % 1000000007, 1000000005) %
        1000000007]++;
      if (D[(abs(a) % 1000000007) * pow(abs(b) % 1000000007, 1000000005) %
            1000000007] == 1)
        d.push_back((abs(a) % 1000000007) *
                    pow(abs(b) % 1000000007, 1000000005) % 1000000007);
    }
  }
  map<int, int> f;
  long long ans = 1;
  int x;
  for (i = 0; i < c.size(); i++) {
    x = pow(c[i], 1000000005);
    ans = ans * (pow(2, C[c[i]]) + pow(2, D[x]) - 1) % 1000000007;
    f[x] = 1;
  }
  for (i = 0; i < d.size(); i++) {
    if (f[d[i]] != 1) {
      ans = ans * pow(2, D[d[i]]) % 1000000007;
    }
  }
  cout << ans - 1 << endl;
}
