#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef vector<int> vi;            typedef vector<ll> vl;
typedef vector<vi> vvi;         typedef vector<vl> vvl;
typedef pair<int, int>     pii;    typedef pair<ll, ll> pll;
typedef vector<pii> vii;         typedef vector<pll> vll;
typedef map<int,int> mii;
typedef vector<char> vc;
typedef vector<bool> vb;
#define endl '\n'
#define forn(i,n) for(int i=0;i<n;i++)
#define rforn(i,n) for(int i=n-1;i>=0;i--)
#define forne(i,n) for(int i=1;i<=n;i++)
#define rforne(i,n) for(int i=n;i>=1;i--)
#define forse(i,s,e) for(int i=s;i<e;i++)
#define rforse(i,s,e) for(int i=e-1;i>=s;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (ll)x.size()
#define MOD 1000000007
#define F first
#define S second
#define pb push_back
#define pf push_front
#define rb pop_back
#define rf pop_front
#define in insert
#define mp make_pair
#define fill(a,x) memset(a,x,sizeof a);
#define trav(a,x) for(auto &a:x)
#define min3(a, b, c) min(min(a, b), c)
#define min4(a, b, c, d) min(min(a, b), min(c, d))
#define max3(a, b, c) max(max(a, b), c)
#define max4(a, b, c, d) max(max(a, b), max(c, d))
const ll INFL = 1e18;
const int INFI = 1e9;
const double pi = 3.14159265358979323846; 
#ifdef KARAN
    #include "../../trace.h"
#else
    #define trace(args...)
#endif

ll div_floor(const ll &a,const ll &b) { return a / b - (((a ^ b) < 0) and a % b);}
ll div_ceil(const ll &a,const ll &b) { return a / b + (((a ^ b) >= 0) and a % b);}
ll modpow(ll a, ll b, ll m = MOD){a %= m; ll res = 1; 
    while (b) {if (b & 1)res = (res * a) % m; a = (a * a) % m; b >>= 1;} return res;}
ll bpow(ll a, ll b){ll res = 1; while (b) {if (b & 1)res = res * a; a = a * a; b >>= 1;} return res;}
ll modinv(ll a, ll m = MOD) {return modpow(a, m - 2, m);}
void graph(vvi &adj, int m) {int x, y; forn(i, m){cin>>x>>y; adj[--x].pb(--y); adj[y].pb(x);}}

void solve(){
    ll n; cin>>n;
    vl a(n), b(n);
    forn(i, n) cin>>a[i]>>b[i];
    map<pll, int> cntr;
    ll cnta = 0, cntb = 0, cntab = 0;
    ll ans = 1;
    forn(i, n){
        if(a[i]==0&&b[i]==0)
           cntab++;
        else if(a[i]==0)
            cnta++;
        else if(b[i]==0)
            cntb++;
        else{
            if(a[i]<0&&b[i]<0)
                a[i] *= -1, b[i] *= -1;
            ll g = __gcd(abs(a[i]), abs(b[i]));
            if(a[i]>0&&b[i]>0)
                cntr[{a[i]/g, b[i]/g}]++;
            else
                cntr[{-abs(a[i])/g, abs(b[i])/g}]++;
        }
    }
    ans = ans + (cntab>0);
    if(cnta>0&&cntb>0)
        ans = (ans*(modpow(2, cnta) + modpow(2, cntb)))%MOD;
    else
        ans = (ans*modpow(2, cnta)*modpow(2, cntb))%MOD;
    for(auto p: cntr){
        pll p1;
        if(p.F.F>0&&p.F.S>0)
            p1 = {-p.F.S, p.F.F};
        else
            p1 = {p.F.S, -p.F.F};
        if(cntr.find(p1)==cntr.end())
            ans = (ans*modpow(2, p.S))%MOD;
        else if(p1<p.F)
            continue;
        else
            ans = (ans*(modpow(2, cntr[p.F]) + modpow(2, cntr[p1]) - 1))%MOD;
    }
    ans = (ans - 1 + MOD)%MOD;
    cout<<ans<<endl;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    #ifdef KARAN
        freopen("inp.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
        freopen("err.txt", "w", stderr);
    #endif
    int t=1;
    // cin>>t;
    while(t--)
        solve();
}