//#include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
//#include "boost/multiprecision/cpp_int.hpp"
//typedef boost::multiprecision::cpp_int LL;
typedef long double dd;
#define i_7 (ll)(1E9+7)
//#define i_7 998244353
#define i_5 i_7-2
ll mod(ll a){
    ll c=a%i_7;
    if(c>=0)return c;
    return c+i_7;
}
typedef pair<ll,ll> l_l;
typedef pair<dd,dd> d_d;
ll inf=(ll)1E16;
#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define pb push_back
ll max(ll a,ll b){if(a<b)return b;else return a;}
ll min(ll a,ll b){if(a>b)return b;else return a;}
void Max(ll &pos,ll val){pos=max(pos,val);}//Max(dp[n],dp[n-1]);
void Min(ll &pos,ll val){pos=min(pos,val);}
void Add(ll &pos,ll val){pos=mod(pos+val);}
dd EPS=1E-9;
#define fastio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fi first
#define se second
#define endl "\n"
#define SORT(v) sort(v.begin(),v.end())
#define ERASE(v) v.erase(unique(v.begin(),v.end()),v.end())
#define POSL(v,x) (lower_bound(v.begin(),v.end(),x)-v.begin())
#define POSU(v,x) (upper_bound(v.begin(),v.end(),x)-v.begin())
template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}
template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

//////////////////////////


ll gcd(ll a,ll b){
    if(a>b)swap(a,b);
    if(a==0)return b;
    return gcd(b%a,a);
}

ll po(ll i,ll p){
    if(p==0)return 1;
    else{
        i=mod(i);
        if(p==1)return i;
        if(p%2==0)return po(mod(i*i),p/2);
        return mod(i*po(i,p-1));
    }
}
ll bunbo(ll n){
    return po(n,i_5);
}
#define N 200005
ll n;
ll a[N],b[N];
void guc(){
    ll cnt=0;
    rep(i,1,(1<<n)-1){
        vector<l_l>v;
        rep(j,0,n-1){
            if((i>>j)&1)v.pb({a[j],b[j]});
        }
        ll vs=v.size();
        bool f=true;
        rep(j,0,vs-1){
            rep(k,j+1,vs-1){
                if(v[j].fi*v[k].fi+v[j].se*v[k].se==0)f=false;
            }
        }
        if(f)cnt++;
    }
    cout<<cnt<<endl;
}

int main(){fastio
    
    cin>>n;
    rep(i,0,n-1)cin>>a[i]>>b[i];
    //guc();
    ll f=0;
    ll A=0,B=0;
    vector<l_l>v;
    rep(i,0,n-1){
        if(a[i]==0&&b[i]==0){
            f++;
            continue;
        }
        if(a[i]==0){
            A++;
        }else if(b[i]==0){
            B++;
        }else{
            if(b[i]<0){
                b[i]*=-1;
                a[i]*=-1;
            }
            ll g=gcd(abs(a[i]),abs(b[i]));
            a[i]/=g;
            b[i]/=g;
            v.pb({a[i],b[i]});
        }
    }
    sort(v.begin(),v.end());
    ll ans=po(2,A)+po(2,B)-1;
    ans=mod(ans);
    ll vs=v.size();
    
    map<l_l,ll>mp;
    rep(i,0,vs-1){
        ll c=1;
        while(i<=vs-2){
            if(v[i]==v[i+1]){
                i++;c++;
            }else break;
        }
        mp[v[i]]=c;
    }
    
    set<l_l>used;
    for(auto X:mp){
        l_l x=X.fi;
        ll cnt=X.se;
        if(cnt==0)continue;
        if(used.find(x)!=used.end())continue;
        l_l ser={-x.se,x.fi};
        if(ser.se<0){
            ser.fi*=-1;
            ser.se*=-1;
        }
        
        if(mp.find(ser)==mp.end()){
            ans=mod(ans*po(2,cnt));
        }else{
            ll op=mp[ser];
            ll ad=po(2,cnt)+po(2,op)-1;
            ad=mod(ad);
            ans=mod(ans*ad);
            used.insert(ser);
        }
        
    }
    cout<<mod(ans-1+f)<<endl;
    
    return 0;
}
/*
 5
 0 0
 1 0
 0 12
 1 21
 -1 21
 */


Measured memory_bytes: 21684