//ヘッダー
#include<bits/stdc++.h>
using namespace std;

//型定義
typedef long long ll;

//定数
const ll INF=1e+18;
const int MOD=1e+9+7;

//REPマクロ
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define REP2(i,a,b) for(ll i=a;i<(ll)(b);i++)
#define REPD2(i,a,b) for(ll i=a;i>(ll)(b);i--)

//vectorの扱い
#define ALL(x) (x).begin(),(x).end() //sortなどの引数省略
#define SIZE(x) ((ll)(x).size()) //size
#define MAX(x) *max_element(ALL(x)) //最大値
#define MIN(x) *min_element(ALL(x)) //最小値

//グローバル変数
// xのn乗%modを計算
ll mod_pow(ll x, ll n, ll mod){
    ll res = 1;
    while(n > 0){
        if(n & 1) res = res*x%mod;
        x = x*x%mod;
        n >>= 1;
    }
    return res;
}

//ライブラリ挿入
int main(){
    int N;
    cin>>N;
    vector<ll> A(N),B(N);
    map<pair<ll,ll>,pair<ll,ll>> C;
    ll cnt_00=0;
    REP(i,N){
        cin>>A[i]>>B[i];
        if(A[i]==0&&B[i]==0){cnt_00++;}
        else if(A[i]==0){C[make_pair(A[i],INF)].first++;}
        else if(B[i]==0){C[make_pair(B[i],INF)].second++;}
        else{
            if(A[i]<0){A[i]*=-1;B[i]*=-1;}
            ll g=__gcd(abs(A[i]),abs(B[i]));
            if(B[i]>0){C[make_pair(A[i]/g,B[i]/g)].first++;}
            else{C[make_pair(-B[i]/g,A[i]/g)].second++;}
        }
    }

    ll ans=cnt_00;
    ll c1,c2;

    ll tmp=1;
    for(auto itr=C.begin();itr!=C.end();itr++){
        c1=itr->second.first;
        c2=itr->second.second;
        tmp*=((mod_pow(2,c1,MOD)+mod_pow(2,c2,MOD)-1)%MOD);
        tmp%=MOD;
    }
    ans+=tmp-1;
    ans%=MOD;
    cout<<ans<<endl;


    
}