#include <bits/stdc++.h>

using namespace std;
#define sz(x) (int)((x).size())
#define forn(i,n) for (int i=0; i < n; i++)
#define forse(i,s,e) for (int i=s; i < e; i++)
#define pb push_back
#define pf push_front
#define rb pop_back
#define rf pop_front
#define mp make_pair
#define fi first
#define se second
#define all(vec) vec.begin(), vec.end()
#define time() ((double)clock() / CLOCKS_PER_SEC)

typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

double PI=3.141592653589793;

const ll P=1e9+7;
class mint{
	public:
		static int init_siz;
		static vector<mint> inverse,factorial;
		static int mintP;
		int n;
		static mint exp(mint a, long long e) {
			mint res = 1; while (e) { if (e&1) res *= a; a *= a; e >>= 1; }
			return res;
		}
		static void init(int n){
			init_siz=n;
			inverse.resize(n+1);factorial.resize(n+1);
			factorial[0] = 1;
			for (int i = 1; i <= n; i++) factorial[i] = factorial[i - 1] * i;
			inverse[n]=exp(factorial[n],mintP-2);
			for (int i = n-1; i>=0; i--) inverse[i] = inverse[i+1] * (i+1);
		}
		static mint inv(mint const& a){return (init_siz>=a.n? inverse[a.n]*(a.n>1?fac(a-1):1):exp(a,mintP-2));}
		static mint cinv(mint const& a){return (init_siz>=a.n? inverse[a.n]:exp(fac(a),mintP-2));}
		static mint fac(mint const& a){
			if(init_siz>=a.n) return factorial[a.n];
			else{
				mint out=1;
				for(int i=0;i<a.n;i++) out*=(i+1);
				return out;
			}
		}
		mint(long long val = 0) {n=val%mintP;if(n<0) n+=mintP;}
		mint& operator+=(mint const& b) {n += b.n; if (n >= mintP) n -= mintP; return *this;}
		mint& operator-=(mint const& b) {n -= b.n; if (n < 0) n += mintP;return *this;}
		mint& operator*=(mint const& b) {n = (long long)n * b.n % mintP;return *this;}
		mint exp(long long e) {return exp(*this,e);}
		mint inv(){return inv(*this);}
		mint& operator/=(mint const& b){ return *this *=inv(b);}	
		friend std::ostream& operator<<(std::ostream& os,mint const& a) {return os << (a.n<0?a.n+mintP:a.n);}
		friend mint operator+(mint a, mint const b) { return a += b; }
		friend mint operator-(mint a, mint const b) { return a -= b; }
		friend mint operator-(mint const a) { return 0 - a; }
		friend mint operator*(mint a, mint const b) { return a *= b; }
		friend mint operator/(mint a, mint const b) { return a /= b; }
		friend bool operator==(mint const& a, mint const& b) {return a.n == b.n;}
		friend bool operator!=(mint const& a, mint const& b) {return a.n != b.n;}
};
int mint::init_siz=0;
int mint::mintP=P;
vector<mint> mint::factorial,mint::inverse;
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }

void solve(){
	int n;int zcnt=0;
	cin >> n;
	map<pll,pii> cnts;

	forn(i,n){
		ll a,b;
		cin >> a >> b;
		if(a==0&&b==0){
			zcnt++;
			continue;
		}else if(a==0){
			cnts[make_pair(0,1)].fi++;
			continue;
		}else if(b==0){
			cnts[make_pair(0,1)].se++;
			continue;
		}

		bool sig=0;
		if((a<0&&b>0)||(a>0&&b<0)) sig=1;
		a=abs(a);b=abs(b);

		ll g=__gcd(a,b);
		a/=g;b/=g;

		pll tem={b,a};
		if(!sig&&b>0) tem.se*=-1;

		if(sig) b*=-1;

		if(cnts.find({a,b})!=cnts.end()){
			cnts[make_pair(a,b)].fi+=1;
		}else if(cnts.find(tem)!=cnts.end()){
			cnts[tem].se+=1;
		}else 
			cnts[make_pair(a,b)].fi+=1;

	}

	mint out=1;
	for(auto i:cnts){
//		cout << i.fi.fi << ' ' << i.fi.se << ' ' << i.se.fi << ' ' << i.se.se << endl;
		out*=(mint::exp(2,i.se.fi)+mint::exp(2,i.se.se)-1);
	}
	out-=1;
	out+=zcnt;
	cout << out;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); 
	int T=1;
//	cin >> T;
	forn(c,T){
//		cout << "Case #" << c+1 << ": ";
		solve();
	}
}


Measured memory_bytes: 16072