#include <bits/stdc++.h>
long gcd(long a, long b) {
  if (a % b == 0)
    return b;
  else
    gcd(b, a % b);
}
long long int modpow(long a, long b, long c) {
  long long re = 1;
  while (b >= 1) {
    if (b & 1) re = re * a % c;
    a = a * a % c;
    b = b >> 1;
  }
  return re;
}
int main() {
  long mod = 1000000007;
  int n;
  scanf("%d", &n);
  int zero = 0;
  int ky[205][205] = {0};
  long mp[200005][2] = {0};
  int mpsize = 0;
  for (int i = 1; i <= n; i++) {
    long x, y;
    scanf("%ld %ld", &x, &y);
    if (!x && !y) {
      zero++;
      continue;
    }
    if (x != 0 && y != 0) {
      long ma = ((((x) < 0 ? -(x) : (x))) < (((y) < 0 ? -(y) : (y)))
                     ? (((y) < 0 ? -(y) : (y)))
                     : (((x) < 0 ? -(x) : (x)))),
           mi = ((((x) < 0 ? -(x) : (x))) > (((y) < 0 ? -(y) : (y)))
                     ? (((y) < 0 ? -(y) : (y)))
                     : (((x) < 0 ? -(x) : (x))));
      long g = gcd(ma, mi);
      x /= g;
      y /= g;
    }
    if (y < 0) y = -y, x = -x;
    if (y == 0 && x < 0) y = -y, x = -x;
    int rot90 = (x <= 0);
    if (rot90) {
      do {
        long t = x;
        x = y;
        y = t;
      } while (0);
      y = -y;
    }
    if (ky[x][y] == 0) ky[x][y] = ++mpsize;
    if (rot90)
      mp[ky[x][y]][0]++;
    else
      mp[ky[x][y]][1]++;
  }
  long ans = 1;
  for (int i = 1; i <= mpsize; i++) {
    int s = mp[i][0];
    int t = mp[i][1];
    int now = 1;
    now = now + modpow(2, (long)s, mod) - 1;
    now = now + modpow(2, (long)t, mod) - 1;
    ans *= now;
  }
  ans -= 1;
  ans += zero;
  printf("%ld\n", ans);
  return 0;
}
