#include <bits/stdc++.h>
using namespace std;
using ll=long long;
/*
gcdとって簡略化するかな
0の考慮ぬけてんのか
ペアになるとりかたで１まとまりと考えるか
1 0
1 0
1 0
0 1
0 1
なら、この5個で１かたまり、
1 0=2^3
0 1=2^2
=12通り
*/

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);
  Z[0]=1;
  for(ll i=1; i<=N; i++) (Z[i]*=Z[i-1])%=MOD;
  Z[0]=0;
//まずmapつくる
  for(ll i=0; i<N; i++){
    ll a,b; cin>>a>>b;
    if(a==0 && b==0){
      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) M[make_pair(0,INF)]++;
    else if(b==0) M[make_pair(INF,0)]++;
  }
//数え上げ
  for(auto v: M){//0 0は除外
    ll val1=v.second;
    if(val1==-1) continue;
    ll a=v.first.first;
    ll b=v.first.second;
    ll val2=0;
    if(a!=0 && b!=0){
      val2+=M[make_pair(b,-a)];
      val2+=M[make_pair(-b,a)];
    }
    else if(a==0) val2+=M[make_pair(INF,0)];
    else if(b==0) val2+=M[make_pair(0,INF)];
    (ans*=(Z[val1]+Z[val2])%MOD)%=MOD;
    if(a!=0 && b!=0){
      M[make_pair(b,-a)]=-1;
      M[make_pair(-b,a)]=-1;
    }
    else if(a==0) M[make_pair(b,0)]=-1;
    else if(b==0) M[make_pair(0,a)]=-1;
  }
  ans--;
  ans+=zero;
  if(ans<0) ans+=MOD;
  cout<<ans<<endl;  
}