#include<bits/stdc++.h>
#define rep(i,b) for(int i=1;i<=b;i++)
#define drep(i,b) for(int i=b;i>=1;i--)
#define Rep(i,a,b) for(int i=a;i<=b;i++)
#define pr pair<int,int>
#define ff first
#define ss second
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+5;
const int mod=1e9+7;
int n,m,k,t,x,y,z;

#define prr pair<pr,int>

int poww(int x,int k) {
    if(k==0) return 1;
    int t=poww(x,k/2);
    if(k&1) return t*t%mod*x%mod;
    else return t*t%mod;
}

void solve(int ans=1) {
    cin>>n;
    map<pr,int> mp;
    vector<pr> b;
    rep(i,n) {
        cin>>x>>y;
        int t=__gcd(x,y);
        //cout<<t<<endl;
        if(t) x/=t,y/=t;
        if(x<0) x*=-1,y*=-1;
        mp[pr(x,y)]++;
    }
    for(prr p:mp) if(p.ss) {
        y=-p.ff.ff,x=p.ff.ss;
        if(x<0) y*=-1,x*=-1;
        int &t=mp[pr(x,y)],t2=p.ss;
        //cout<<x<<' '<<y<<' '<<t<<endl;
        if(t&&(x||y)) b.push_back(pr(t,t2));
        else ans=(ans*poww(2,t2))%mod;
        t=0;
    }
    rep(i,b.size()) {
        int x=b[i-1].ff,y=b[i-1].ss;
        ans=ans*((poww(2,x)%mod+poww(2,y)%mod-1+mod)%mod)%mod;
    }
    cout<<(ans-1+mod)%mod<<endl;
}

#undef int
int main() {
    ios::sync_with_stdio(false);
    //int T;cin>>T;
    //while(T--)
        solve();
}
