#include <bits/stdc++.h>
using namespace std;
//#include "testlib.h"
#define ff first
#define ss second
#define all(v) v.begin(),v.end()
#define int long long
#define ll long long
#define M 1000000007
#define MM 998244353
#define inputarr(a,n) for(int i=0;i<n;++i) cin>>a[i]
#define GCD(m,n) __gcd(m,n)
#define LCM(m,n) m*(n/GCD(m,n))
#define mii  map<ll ,ll >
#define msi  map<string,ll >
#define rep(a,b)    for(ll i=a;i<b;i++)
#define rep0(n)    for(ll i=0;i<n;i++)
#define repi(i,a,b) for(ll i=a;i<b;i++)
#define pb push_back
#define vi vector<ll>
#define vs vector<string>
#define ppb pop_back
#define endl '\n'
#define asdf ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define r0 return 0;
#define FORD(i, a, b) for (int i = (int) (a); i >= (int) (b); --i)
#define inputoutput freopen("output.txt", "w", stdout);
#define Set(a, s) (a, s, sizeof (a))
#define FOR repi
#define vii vector<pii>
#define pii pair<int,int>
#define REVERSE(v) reverse(all(v))
#define trav(a, x) for(auto& a : x)
#define display(x) trav(a,x) cout<<a<<" ";cout<<endl
#define debug cerr<<"bhau"<<endl
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
    std::cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
    const char* comma = strchr(names + 1, ',');std::cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
template<typename T, typename U> static inline void amin(T &x, U y) 
{ 
    if (y < x) 
        x = y; 
}
template<typename T, typename U> static inline void amax(T &x, U y) 
{ 
    if (x < y) 
        x = y; 
}
 
ll max(ll a, ll b) { return (a > b)? a : b;}
int min(int a, int b) { return (a < b)? a : b;} 

int power(int x, unsigned int y, unsigned int m) 
    { 
        if (y == 0) 
            return 1; 
        int p = power(x, y/2, m) % m; 
        p = (p * p) % m; 
      
        return (y%2 == 0)? p : (x * p) % m; 
    } 
int solve(){


    int n;cin>>n;
    int a[n],b[n];
    rep0(n) cin>>a[i]>>b[i];
    map<pii,int>m,m2;
    int cnt=0;
    int sum=0;
    for(int i=0;i<n;i++){
        if(a[i]==0 || b[i]==0){
            cnt++;continue;
        }
        int g=__gcd(abs(a[i]),abs(b[i]));
        int z=a[i]/abs(a[i]);
        z*=(b[i]/abs(b[i]));
        // if(m[{{abs(a[i])}}])
        a[i]/=g;
        b[i]/=g;
        if(z==1){
            z=0;
        }
        else z=1;
        if(z) m[{abs(a[i]),abs(b[i])}]++;
        else m2[{a[i],b[i]}]++;
        sum++;
    }
    int ans=1;
    for(auto i:m){
        if(m2.find({i.ff.ss,i.ff.ff})!=m2.end()){
            int z=m2[{i.ff.ss,i.ff.ff}];
            m2.erase({i.ff.ss,i.ff.ff});
            ans*=(power(2,z,M)+power(2,i.ss,M)-1+M)%M;
            ans%=M;
            // ans*=power(2,i.ss,M);
        }
        else{
            ans*=power(2,i.ss,M);
            ans%=M;
        }
        // trace(i.ff.ff,i.ff.ss,i.ss,ans);
    }
    for(auto i:m2){
        ans*=power(2,i.ss,M);
        ans%=M;
    }
    ans+=cnt-1+M;
    ans%=M;
    cout<<ans;


    return 0;
}
signed main(){
    asdf

    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
