#define _USE_MATH_DEFINES
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <deque>
#include <climits>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
//#include <tuple>

#define INF INT_MAX>>1 
#define SIZE 100010
#define MOD 1000000007
#define rep(i, n) for(int i=0; i<(int)(n); i++)
#define rep2(i, from, to) for(int i=(from); i<(int)(to); i++)
#define all(obj) (obj).begin(), (obj).end()
#define lpair pair<ll, ll>
#define vint vector<ll>
#define vinput(name) for(int i=0; i<(int)(name.size()); i++) cin >> name[i];
#define voutput(name) for(int i=0; i<(int)(name.size()); i++) cout << name[i] << endl;
typedef long long ll;

using namespace std;

// auto mod int
const int mod = 1000000007;
struct mint {
	ll val; // typedef long long ll;
	mint(ll x=0):val((x% mod+mod)%mod){}
	mint operator-() const { return mint(-val); }
	mint& operator+=(const mint a) {
		if((val += a.val) >= mod) val -= mod;
		return *this;
	}
	mint& operator-=(const mint a) {
		if((val += mod-a.val) >= mod) val -= mod;
		return *this;
	}
	mint& operator*=(const mint a) {
		(val *= a.val) %= mod;
		return *this;
	}
	mint operator+(const mint a) const {
		mint res(*this);
		return res+=a;
	}
	mint operator-(const mint a) const {
		mint res(*this);
		return res-=a;
	}
	mint operator*(const mint a) const {
		mint res(*this);
		return res*=a;
	}
	//2^n
	mint pow(ll n) const {
		if(!n) return 1;
		mint a = pow(n>>1);
		a *= a;
		if(n&1) a *= *this;
		return a;
	}
	//x^n
	mint mod_pow(ll x, ll n){
		if(n == 0) return 1;
		mint res = mod_pow(x*x % MOD, n/2);
		if(n & 1) res = res.val * x % MOD;
		return res;
	}
	mint choose(ll n, ll a){
		mint x = 1, y = 1;
		rep(i, a){
			x *= n-i;
			y *= i+1;
		}
		return x / y;
	}

	// for prime mod
	mint inv() const {
		return pow(mod-2);
	}
	mint& operator/=(const mint a) {
		return (*this) *= a.inv();
	}
	mint operator/(const mint a) const {
		mint res(*this);
		return res/=a;
	}
};


vector<lpair> p;
ll gcd(ll a, ll b){ return a % b == 0 ? b : gcd(b, a%b); }

int main() {
	int n;
	cin >> n;
	int zero = 0;
	map<pair<ll, ll>, P> mp;
	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 rot90 = (x <= 0);
		if(rot90) {
			ll tmp = x;
			x = y; y = -tmp;
		}
		if(rot90) mp[{x, y}].first++;
		else mp[{x, y}].second++;
	}

	mint ans = 1;
	for(auto p : mp) {
		int s = p.second.first;
		int t = p.second.second;
		mint now = 1;
		now += mint(2).pow(s) - 1;
		now += mint(2).pow(t) - 1;
		ans *= now;
	}
	ans -= 1;

	ans += zero;
	cout << ans << endl;
	return 0;
}