parseInt(x)=parse(Int, x)
parseMap(x::Array{SubString{String},1})=map(parseInt, x)
const p = 10^9+7

function main()
	n = readline() |> parseInt
	a = Tuple{Int,Int}[(0,0) for i in 1:n]
	for i in 1:n
		s,t = readline() |> split |> parseMap
		a[i] = (s,t)
	end
	d = Dict{Tuple{Int,Int},Int}()
	ct = zeros(Int,n)
	for i in 1:n
		v = (0,0)
		if a[i][1]!=0||a[i][2]!=0
			g = gcd(a[i][1],a[i][2])
			m = div(a[i][1]*a[i][2],abs(a[i][1]*a[i][2]))
			v = (m*div(abs(a[i][1]),g),div(abs(a[i][2]),g))
		end
		if haskey(d,(-m*abs(v[1]),abs(v[2])))
			ct[i]=d[(-m*abs(v[1]),abs(v[2]))]
		end
		if haskey(d,v)
			d[v]+=1
		else
			d[v]=1
		end
	end
	bx = ones(Int,n+1)
	for i in 2:n+1
		bx[i]=bx[i-1]*2%p
	end
	ans = 1
	for i in keys(d)
		if i==(0,0)
			ans = ans*(d[i]+1)%p
		else
			m = div(abs(i[1]),i[1])
			if haskey(d,(-m*abs(i[2]),abs(i[1])))
				if i[1]>0
					x = d[i]
					y = d[(-m*abs(i[2]),abs(i[1]))]
					ans = ans*mod(bx[x+y+1]-(bx[x+1]-1)*(bx[y+1]-1)%p,p)%p
				end
			else
				ans = ans*bx[d[i]+1]%p
			end
		end
	end
	println(mod(ans-1,p))
end

main()