#include <bits/stdc++.h>
using namespace std;
using ll=long long;
/*
gcdとって簡略化するかな
0の考慮ぬけてんのか

*/

ll modinv(ll a, ll m) {
    ll b = m, u = 1, v = 0;
    while (b) {
        ll t = a / b;
        a -= t * b; swap(a, b);
        u -= t * v; swap(u, v);
    }
    u %= m;
    if (u < 0) u += m;
    return u;
}

int main(){
  ll N,MOD=1e9+7, INF=1000000000000000001, zero=0, ans=1; cin>>N;
  map<pair<ll,ll>,ll> M;
  vector<ll> Z(N+1,2), INV(N+1,0);
  Z[0]=1;
  for(ll i=1; i<=N; i++) (Z[i]*=Z[i-1])%=MOD;
  for(ll i=1; i<=N; i++) (INV[i]=modinv(Z[i],MOD))%=MOD;
  for(ll i=0; i<N; i++){
    ll a,b; cin>>a>>b;
    if(a==0 && b==0){
      i--;
      N--;
      zero++;
      continue;
    }
    if(a!=0 && b!=0){
      ll c=__gcd(a,b);
      if(c<0) c*=-1;
      a/=c;
      b/=c;
      M[make_pair(a,b)]++;
    }
    else if(a==0){
      b=INF;
      M[make_pair(0,b)]++;
    }
    else if(b==0){
      a=INF;
      M[make_pair(a,0)]++;
    }
    ll tmp=0;
    if(a!=0 && b!=0){
      tmp+=M[make_pair(-b,a)];
      tmp+=M[make_pair(b,-a)];
    }
    else if(a==0) tmp+=M[make_pair(b,0)];
    else if(b==0) tmp+=M[make_pair(0,a)];
    if(tmp>0){
      ll work=ans;
      if(work%2==1) work++;
      (work*=INV[tmp])%=MOD;
      (ans+=work)%=MOD;
    }
    else (ans*=2)%=MOD;
  }
  ans--;
  ans+=zero;
  if(ans<0) ans+=MOD;
  cout<<ans<<endl;
}