#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;

ll A[200005], B[200005];

map< pair<ll, ll>, ll> mp;
map< pair<ll, ll>, int> used;

ll modpow(ll a, ll n, ll mod) {
    ll res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res % mod;
}
int main(int argc, char *argv[]) { ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  int n;cin>>n;
  for(int i=0;i<n;i++){
    cin>>A[i]>>B[i];
    if(A[i] == 0 && B[i]==0){
      mp[{0,0}]++;
    } else if (A[i]==0) {
      mp[{0,1}]++;
    } else if (B[i]==0){
      mp[{1,0}]++;
    } else {
      if (A[i]<0){
        A[i]=-A[i],B[i]=-B[i];
      }
      ll g = __gcd(abs(A[i]), abs(B[i]));
      A[i]/=g;
      B[i]/=g;
      mp[{A[i], B[i]}]++;
    }
  }
  ll mod=1000000007;
  ll ans=1;
  for(auto& kv : mp) {
    ll t=1;
    auto pll = kv.first;
    auto cnt = kv.second;
    if (pll.first == 0 && pll.second==0) {ans += cnt;}
    else if (pll.first == 0) {
      t = modpow(2, cnt, mod) + modpow(2, mp[{1,0}] ,mod) -1;
    } else if (pll.second<=0){
      continue;
    } else {
      pair<ll, ll> pll2 = {pll.second,-pll.first};
      t = modpow(2, cnt, mod) + modpow(2, mp[pll2] ,mod) -1;
      used[pll2]=1;
    }
    used[pll]=1;
    ans *= t; ans %= mod;
  }
  ll unused=0;
  for(auto& kv : mp) {
    if(!used[kv.first])unused++;
  }
  ans *= modpow(2, unused, mod);

  cout<<(ans-1+mod)%mod<<endl;
  
  return 0;
}
