#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define loop(__x, __start, __end) for(int __x = __start; __x < __end; __x++)

template<int MOD>
struct ModInt {
  ll x;
  ModInt():x(0){}
  ModInt(ll x):x((x%MOD+MOD)%MOD){}
  int getMod() { return MOD; }
  ModInt operator-() const { return ModInt(0) - *this;}
  ModInt& operator+=(const ModInt& a){ if((x+=a.x)>=MOD) x-=MOD; return *this;}
  ModInt& operator-=(const ModInt& a){ if((x+=MOD-a.x)>=MOD) x-=MOD; return *this;}
  ModInt& operator*=(const ModInt& a){ (x*=a.x)%=MOD; return *this;}
  ModInt operator+(const ModInt& a)const{ return ModInt(*this) += a;}
  ModInt operator-(const ModInt& a)const{ return ModInt(*this) -= a;}
  ModInt operator*(const ModInt& a)const{ return ModInt(*this) *= a;}
  bool operator<(const ModInt& a)const{ return x < a.x;}
  bool operator==(const ModInt& a)const{ return x == a.x;}
  ModInt pow(ll t) const {
    if (!t) return 1;
    ModInt a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }
  friend istream & operator >> (istream & in, ModInt & v) {
    ll x;
    in >> x;
    v.x = x;
    return in;
  }
  friend ostream & operator << (ostream & out, ModInt<MOD> const & v) {
    out << v.x;
    return out;
  }
};
const int MOD = 1000000007;
using mint = ModInt<MOD>;

typedef pair<ll, ll> P;

P rev(P p) {
  swap(p.first, p.second);
  if (p.first == 0 or p.second == 0) {
    swap(p.first, p.second);
    return p;
  }

  p.first *= -1;
  if (p.second < 0) p.first *= -1, p.second *= -1;
  return p;
}

int main() {
  int n; cin >> n;
  map<P, int> M;
  int zero2 = 0, a_zero = 0, b_zero = 0;
  loop(i,0,n) {
    ll a, b; cin >> a >> b;
    if (a == 0 and b == 0) M[P(0, 0)]++;
    else if (a == 0) M[P(0, 1)]++;
    else if (b == 0) M[P(1, 0)]++;
    else {
      ll gc = __gcd(abs(a), abs(b));
      a /= gc, b /= gc;
      if (b < 0) a *= -1, b *= -1;
      M[P(a, b)]++;
    }
  }

  auto aa = [&](const P p1) {
    return mint(2).pow(M[p1]);
  };

  auto ab = [&](const P p1, const P p2) {
    // それぞれのグループ独立に1個以上選ぶ.
    // さらに両グループから1つも選ばない場合で+1
    return (mint(2).pow(M[p1]) - 1) + (mint(2).pow(M[p2]) - 1) + 1;
  };

  // mint ans = ab(P(1,0), P(0,1));
  mint ans = 1;
  set<P> S;
  for (auto &&m: M) {
    if (m.first.first == 0 and m.first.second == 0) continue;
    if (S.count(m.first)) continue;
    ll count = m.second;
    P p = rev(m.first);
    if (M[p] > 0) {
      ans *= ab(p, m.first);
    } else {
      ans *= aa(m.first);
    }
    S.insert(p);
  }

  // 各有理数rグループから1つも選ばないのもカウントしてるので-1
  ans -= 1;

  // (0, 0)の場合はそれ１つを選ぶしかない.
  ans += M[P(0, 0)];
  cout << ans << endl;
  return 0;
}
