#include <bits/stdc++.h>
using namespace std;
long long int mod = 1000000007;
double pi = 3.14159265358979;
long long int r(long long int x, long long int y) {
  if (y == 0)
    return 1;
  else if (y % 2 == 0)
    return r(x, y / 2) * r(x, y / 2) % mod;
  else
    return x * r(x, (y - 1) / 2) % mod * r(x, (y - 1) / 2) % mod;
}
long long int gcd(long long int x, long long int y) {
  long long int M = max(x, y);
  long long int m = min(x, y);
  while (M % m != 0) {
    long long int l = m;
    m = M % m;
    M = l;
  }
  return m;
}
int main() {
  long long int n;
  cin >> n;
  queue<pair<int, int>> q;
  map<pair<int, int>, long long int> ma1;
  map<pair<int, int>, long long int> ma2;
  int a0 = 0;
  int b0 = 0;
  int ab0 = 0;
  long long int N = 0;
  for (int i = 0; i < n; i++) {
    long long int a, b;
    cin >> a >> b;
    if (a == 0) {
      if (b != 0)
        a0++;
      else
        ab0++;
    } else if (b == 0)
      b0++;
    else {
      long long int g = gcd(a, b);
      a /= g;
      b /= g;
      if (a < 0) {
        a = 0 - a;
        b = 0 - b;
      }
      long long int A = a;
      long long int B = b;
      if (B < 0) {
        B = 0 - B;
        A = 0 - A;
      }
      if (ma2[make_pair(a, b)] == 0 && ma2[make_pair(B, -A)] == 0)
        q.push(make_pair(a, b));
      ma1[make_pair(B, -A)]++;
      ma2[make_pair(a, b)]++;
      if (ma2[make_pair(B, -A)] >= 1 && ma2[make_pair(a, b)] == 1) N++;
    }
  }
  long long int count = 0;
  vector<vector<long long int>> v(N, vector<long long int>(0));
  long long int i = 0;
  long long int NN = 0;
  while (!q.empty()) {
    long long int cA = ma2[q.front()];
    long long int a, b;
    tie(a, b) = q.front();
    long long int A = a;
    long long int B = b;
    if (B < 0) {
      B = 0 - B;
      A = 0 - A;
    }
    long long int cB = ma2[make_pair(B, -A)];
    if (cB != 0) {
      long long int ccA = r(2, cA) - 1;
      long long int ccB = r(2, cB) - 1;
      v[i].push_back(ccA);
      v[i].push_back(ccB);
      v[i].push_back(1);
    } else
      NN++;
    q.pop();
    i++;
  }
  queue<long long int> p;
  p.push(1);
  for (int i = 0; i < N; i++) {
    long long int J = p.size();
    for (int j = 0; j < J; j++) {
      for (int x : v[i]) {
        long long int P = p.front() * x % mod;
        p.push(P);
      }
      p.pop();
    }
  }
  long long int sum = 0;
  while (!p.empty()) {
    sum += p.front();
    sum %= mod;
    p.pop();
  }
  long long int NNN = r(2, NN);
  sum = sum * NNN % mod;
  sum--;
  count += sum;
  count %= mod;
  n -= ab0;
  long long int a0n = n - a0;
  long long int b0n = n - b0;
  if (a0 > 0) {
    long long int A0 = r(2, a0) - 1;
    long long int A0n = r(2, a0n - b0) - 1;
    long long int A00 = A0 * A0n % mod;
    count += A00;
    count %= mod;
  }
  if (b0 > 0) {
    long long int B0 = r(2, b0) - 1;
    long long int B0n = r(2, b0n - a0) - 1;
    long long int B00 = B0 * B0n % mod;
    count += B00;
    count %= mod;
  }
  printf("%lld\n", count);
}
