#include <iostream>
#include <fstream>
#include <iomanip>
#include <utility>
#include <cmath>
#include <random>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <string>
#include <algorithm>
using namespace std;

#define rep(i,n) for(int i = 0; i<n; ++i)
#define REP(i,n) for(int i = 1; i<=n; ++i)
#define all(x) begin(x),end(x)
#define show(obj) {for(auto x:obj)cout<<x<<' ';cout<<endl;}
#define line "----------"
typedef long long ll;
typedef pair<int,int> P;
const int inf = 1001001000;
const ll INF = 1LL<<60;
const int MOD = (int)1e9 + 7;

const int mod = 1000000007;
struct mint {
    ll x; 
    mint(ll x = 0):x((x%mod+mod)%mod){}
    mint operator-() const {return mint(-x);}
    mint& operator+=(const mint a){
        if((x += a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator-=(const mint a){
        if((x += mod-a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator*=(const mint a){(x*=a.x)%mod; return *this;}
    mint operator+(const mint a) const {return mint(*this) += a;}
    mint operator-(const mint a) const {return mint(*this) -= a;}
    mint operator*(const mint a) const {return mint(*this) *= a;}
    mint pow(ll t) const {
        if(!t)return 1;
        mint a = pow(t>>1);
        a *= a;
        if(t&1) a *= *this;
        return a;
    }

    mint inv() const {return pow(mod-2);}
    mint& operator/=(const mint a){return *this *= a.inv();}
    mint operator/(const mint a) const{return mint(*this) /= a.inv();}
};
istream& operator>>(istream& is, const mint& a){return is>>a.x;}
ostream& operator<<(ostream& os, const mint& a){return os<<a.x;}

int main(){
	int N; cin>>N;
	int zero = 0;
	map<pair<ll,ll>, P> el;
	rep(i,N){
		ll x,y;
		cin>>x>>y;
		if(x == 0 && y == 0){
			++zero;
			continue;
		}
		ll g = gcd(x,y);
		x /= g;
		y /= g;
		if(y<0)x = -x, y = -y;
		if(y == 0 && x < 0)x = -x, y = -y;
		bool rot = false;
		if(x<=0){
			rot = true;
			ll tmp = x;
			x = y;
			y = -tmp;
		}
		if(rot)el[{x,y}].first++;
		else el[{x,y}].second++;
	}
	mint ans = 1;
	for(auto x: el){
		int a = x.second.first;
		int b = x.second.second;
		mint t = 1;
		t += mint(2).pow(a) -1;
		t += mint(2).pow(b) -1;
		ans *= t;
	}
	ans -= 1;
	ans += zero;
	cout<<ans<<endl;
	return 0;
}