#include <stdio.h>
#include <stdlib.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
ll pom(ll a,ll n,int m){ll x=1;for(a%=m;n;n/=2)n&1?x=x*a%m:0,a=a*a%m;return x;}
#define MOD 1000000007

typedef struct pair{ll x,y;}P;
ll gcd(ll p,ll q){while(q){ll t=p%q;p=q;q=t;}return p;}

int cmp(const void*p,const void*q){
	if((*(P*)p).x<(*(P*)q).x)return -1;
	if((*(P*)p).x>(*(P*)q).x)return 1;
	if((*(P*)p).y<(*(P*)q).y)return -1;
	if((*(P*)p).y>(*(P*)q).y)return 1;
	return 0;
}

P pp[200010],*p=pp,mm[200010],*m=mm,*t;
int pcnt,mcnt;
int zero;

int bs(P p){
	int l=-1,r=mcnt;
	while(r-l>1){
		int mid=(l+r)/2;
		if(cmp(m+mid,&p)<0)l=mid;
		else r=mid;
	}
	return cmp(m+r,&p)?-1:r;
}

int main(){
	int n;
	scanf("%d",&n);
	rep(i,0,n){
		ll x,y;
		scanf("%lld%lld",&x,&y);
		if(x==0&&y==0){
			zero++;
		}else{
			ll d=gcd(x,y);
			x/=d;
			y/=d;
			if(y<0){
				x*=-1;
				y*=-1;
			}
			if(x>0){
				p[pcnt].x=x;
				p[pcnt].y=y;
				pcnt++;
			}else{
				m[mcnt].x=x;
				m[mcnt].y=y;
				mcnt++;
			}
		}
	}
	qsort(p,pcnt,sizeof(P),cmp);
	qsort(m,mcnt,sizeof(P),cmp);
	
	ll ans=1;
	rep(k,0,2){
		int pnum=0;
		rep(i,0,pcnt){
			pnum++;
			if(cmp(p+i,p+i+1)==0)continue;
			P ppp={-p[i].y,p[i].x};
			if(k){
				ppp.x*=-1;
				ppp.y*=-1;
			}
			int idx=bs(ppp);
			if(idx==-1){
				ans=ans*pom(2,pnum,MOD)%MOD;
			}else{
				if(k){
					int mnum=1;
					while(cmp(m+idx,m+idx+mnum)==0)mnum++;
					ans=ans*(pom(2,pnum,MOD)+pom(2,mnum,MOD)-1)%MOD;
				}
			}
			pnum=0;
		}
		t=p;p=m;m=t;
		int temp=pcnt;pcnt=mcnt;mcnt=temp;
	}
	printf("%lld\n",(ans+zero+MOD-1)%MOD);
}