import sys
input = sys.stdin.readline

def I(): return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))

def main():
    mod=10**9
    N=I()
    from math import gcd
    d={}
    for i in range(N):
        a,b=MI()
        if (a,b)!=(0,0):
            g=gcd(abs(a),abs(b))
            a=a//g
            b=b//g
        if (a,b) in d:
            d[(a,b)]+=1
        else:
            d[(a,b)]=1
        
    ans=1
    L=[]
    for k in d.keys():
        L.append((k,d[k]))

    L2=[0,0,0,0]

    for i in range(len(L)):
        k=L[i][0]
        if k==(0,0):
            continue
        v=d[k]
        d[k]=0
        temp=pow(2,v)
        a,b=k
        if a*b!=0:
            if (-b,a) in d:
                v2=d[(-b,a)]
                if v2!=0:
                    temp+=pow(2,v2)-1
                    d[(-b,a)]=0
            if (b,-a) in d:
                v2=d[(b,-a)]
                if v2!=0:
                    temp+=pow(2,v2)-1
                    d[(b,-a)]=0
            ans=(ans*temp)%mod
                    
        if (a,b)==(0,1):
            L2[0]=pow(2,v)-1
        elif (a,b)==(0,-1):
            L2[1]=pow(2,v)-1
        elif (a,b)==(1,0):
            L2[2]=pow(2,v)-1
        elif (a,b)==(-1,0):
            L2[3]=pow(2,v)-1
        
        
    temp2=1
    for i in range(2):
        if L2[i]!=0:
            temp2=(temp2*L2[i])%temp
    
            
    temp3=1
    for i in range(2,4):
        if L2[i]!=0:
            temp3=(temp3*L2[i])%temp
            
    temp=(temp2+temp3)-1
        
    ans=(ans*temp)%mod
        
    if (0,0) in d:
        #他の選び方と共存しない
        v=d[(0,0)]
        temp=pow(2,v)-1
        ans=(ans+temp)%mod

    ans=(ans-1)%mod
    print(ans)
        
        
            
            
    #せんぶ０の組みをひく
        
    

main()
