#include <bits/stdc++.h>
//<(") 
#define ll long long   
using namespace std;
 
typedef pair<ll, ll> ii;
typedef pair<ii, ii> iii;
 
const ll mod = 1e9 + 7;
const ll siz =  2e5 + 10;
const ll base = 32;
const ll MAXX = 1e18;

ll n;
map<ii, ll> cnt;

ll Pow(ll a, ll b) {
	if (b == 0) {
		return 1;
	}
	ll sub = Pow(a, b / 2);
	if (b % 2 == 0) {
		return sub * sub % mod;
	}
	return (a * (sub * sub % mod)) % mod;
}

bool check(ii val) {
	return (cnt.find(val) != cnt.end());
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//freopen("INP.txt", "r", stdin);
	//freopen("OUT.txt", "w", stdout);
	cin >> n;
	ll djtmemay = 0;
	for (ll i = 0; i < n; i++) {
		ll a, b;
		cin >> a >> b;
		ll g = __gcd(abs(a), abs(b));
		if (ii(a, b) == ii(0LL, 0LL)) {
			djtmemay++;
			continue;
		}
		a /= g; b /= g;
		if (a == 0) {
			b = 1;
		}
		else if (b == 0) {
			a = -1;
		}
		else if (b < 0) {
			a *= -1; b *= -1;
		}
		//cerr << a << ' ' << b << '\n'; 
		cnt[ii(a, b)]++;
	} 
	// for (auto i = cnt.begin(); i != cnt.end(); i++) {
		// cerr << (*i).first.first << ' ' << (*i).first.second << ' ' << (*i).second << '\n';
	// }
	//cerr << "\n\n";
	ll ans = 1;
	for (auto i = cnt.begin(); i != cnt.end(); i++) {
		ll val = (*i).second;
		if (!val) {
			continue;
		}
		bool sub = false;
		ii pos = (*i).first;
		swap(pos.first, pos.second);
		pos.first *= -1;
		if (check(pos) && cnt[pos] > 0) {
			//cerr << "Gei1 : " << ' ' << (*i).first.first << ' ' << (*i).first.second << '\n';
			ll x = cnt[pos];
			ans = (ans * ((Pow(2, val) + Pow(2, x) % mod) - 1 + mod * mod) % mod) % mod;
			cnt[pos] = 0;
			//cerr << ans << '\n';
			continue;
		}
		pos = (*i).first;
		swap(pos.first, pos.second);
		pos.second *= -1;	
		if (check(pos) && cnt[pos] > 0) {
			//cerr << "Gei 1: " << ' ' << (*i).first.first << ' ' << (*i).first.second << '\n';
			ll x = cnt[pos];
			ans = (ans * ((Pow(2, val) + Pow(2, x) % mod) - 1 + mod * mod) % mod) % mod;
			cnt[pos] = 0;
			//cerr << ans << '\n';
			continue;
		}
		//cerr << "Gei 2: " << ' ' << (*i).first.first << ' ' << (*i).first.second << '\n';
		ans = (ans * Pow(2, val)) % mod;
		//cerr << ans << '\n';
	}
	ans = (ans - 1 + mod * mod) % mod;
	cout << (ans + djtmemay) % mod << '\n';
	return 0;
} 