#include <bits/stdc++.h>
using __int64 = long long;
__int64 gcd(__int64 a, __int64 b) {
  __int64 r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  return b;
}
__int64 pow(__int64 a, __int64 b, __int64 d) {
  if (b == 1) {
    return a % d;
  } else if (b == 0) {
    return 1;
  } else {
    a = a % d;
    a = (a * a) % d;
    if (b % 2 == 0) {
      return pow(a, b / 2, d);
    } else {
      return (pow(a, b / 2, d) * a) % d;
    }
  }
}
int main() {
  int N;
  std::cin >> N;
  std::map<std::pair<__int64, __int64>, std::pair<int, int>> mp;
  __int64 a, b;
  __int64 zero = 0;
  for (int i = 0; i < N; i++) {
    std::cin >> a >> b;
    if (a == 0 && b == 0) {
      zero++;
    } else if (a == 0) {
      mp[{0, 1}].first++;
    } else if (b == 0) {
      mp[{0, 1}].second++;
    } else {
      if (a < 0 && b < 0) {
        __int64 g = gcd(-a, -b);
        mp[{(-a / g), (-b / g)}].first++;
      } else if (a < 0) {
        __int64 g = gcd(-a, b);
        mp[{(b / g), (-a / g)}].second++;
      } else if (b < 0) {
        __int64 g = gcd(a, -b);
        mp[{(-b / g), (a / g)}].second++;
      } else {
        __int64 g = gcd(a, b);
        mp[{(a / g), (b / g)}].first++;
      }
    }
  }
  __int64 d = 1000000007;
  __int64 ans = 1;
  __int64 al = 0;
  __int64 be = 0;
  __int64 ga = 0;
  for (auto p : mp) {
    al = p.second.first;
    be = p.second.second;
    ga = 1;
    ga += pow(2, al, d) - 1;
    ga += pow(2, be, d) - 1;
    ans *= ga;
    ans = ans % d;
  }
  ans += zero;
  ans = ans % d;
  ans--;
  if (ans < 0) {
    ans += d;
  }
  std::cout << ans << std::endl;
}
