#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll N=2e5+7;
struct stu{
	ll x,y;
	bool friend operator < (const stu &a,const stu &b){
		if(a.x==b.x) return a.y>b.y;
		return a.x>b.x;
	}
}arr[N];
map<stu,ll>mp;
ll ksm(ll x,ll y){
	ll res=1;
	while(y){
		if(y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res%mod;
}

int main(){
	ll n,x,y;
	cin>>n;
	stu c; 
	int pos=0;
	for(ll i=1;i<=n;i++){
		cin>>c.x>>c.y;
		if(c.x==0&&c.y==0){
			mp[{0,0}]++;
			continue ;
		}
		ll g=__gcd(c.x,c.y);
		c.x/=g;c.y/=g;
		if(c.x<0){
			c.x=0-c.x;
			c.y=0-c.y;
		}
		if(mp[c]==0){
			arr[pos++]=c;
		}
		mp[c]++; 
	}
	ll ans=1;
	for(ll i=0;i<pos;i++){
		if(mp[arr[i]]==0) continue ; 
		ll a1=arr[i].x*(-1);
		ll b1=arr[i].y;
		ll c1=__gcd(a1,b1);
		b1/=c1;a1/=c1;
		if(b1<0) {
			b1=0-b1;
			a1=0-a1;
		}
		ll tmp=0;
		if(mp[{b1,a1}]==0){
			tmp+=ksm(2,mp[arr[i]]); 
		}
		else {
			tmp+=ksm(2,mp[arr[i]]);
			tmp=(tmp+mod)%mod;
			tmp+=ksm(2,mp[{b1,a1}]);
			tmp-=1;
			tmp=(tmp+mod)%mod;
			mp[{b1,a1}]=0;
		}
		ans*=tmp;
		ans=ans%mod;
	}
	ans=ans*ksm(2,mp[{0,0}]);
	ans=ans%mod;
	ans=(ans-1+mod)%mod;
	cout<<ans<<endl;
	return 0;
} 