import io, os
input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline
import sys

# sys.stdout.write(str(n)+"\n")
MODULO = 1000000007
INF = 1e18+10

n = int(input())
a = [0 for i in range(n)]
b = [0 for i in range(n)]

for i in range(n):
	a[i], b[i] = map(int, input().split())

graph = [[] for _ in range(n)]
value_indices = {} # a_b values
zeroes = 0
used = [False for _ in range(n)]
for i in range(n):
	if a[i] == 0 and b[i] == 0:
		zeroes += 1
		used[i] = True
		# for j in range(n):
		# 	graph[i].append(j)
		# 	graph[j].append(i)
	else:
		if a[i] == 0:
			a_b = 0
			m_b_a = INF
		elif b[i] == 0:
			a_b = INF
			m_b_a = 0
		else:
			a_b = a[i] / b[i]
			m_b_a = -b[i] / a[i]

		if m_b_a in value_indices:
			for j in value_indices[m_b_a]:
				graph[i].append(j)
				graph[j].append(i)
		value_indices[a_b] = value_indices.get(a_b, []) + [i]

# print("value_indices", value_indices)
# print("graph", graph)

def dfs_chet_nechet(i, chet=0, nechet=0):
	# print("dfs_chet_nechet", i)
	used[i] = True
	a, b = chet, nechet
	for child in graph[i]:
		if not used[child]:
			a1, b1 = dfs_chet_nechet(child, nechet, chet)
			a += b1
			b += a1
	# print("return  a+1, b")
	return a+1, b


# def comb(i):
# 	# print("comb", i)
# 	layers = [[i], []]
# 	used[i] = True

# 	chet = 0
# 	nechet = 0
# 	is_chet = True
# 	cur_layer_ind = 0
# 	next_layer_ind = 1

# 	while len(layers[cur_layer_ind]) > 0:
# 		if is_chet:
# 			cur_layer_ind = 0
# 			next_layer_ind = 1
# 			chet += len(layers[cur_layer_ind])
# 		else:
# 			cur_layer_ind = 1
# 			next_layer_ind = 0
# 			nechet += len(layers[cur_layer_ind])
# 		is_chet = not is_chet
# 		# layers.append(cur_layer)
# 		layers[next_layer_ind] = []
# 		for item in layers[cur_layer_ind]:
# 			for child in graph[item]:
# 				if not used[child]:
# 					layers[next_layer_ind].append(child)
# 					used[child] = True
# 		# cur_layer = next_layer.copy()
# 	# including empty
# 	return 1*pow(2, chet, MODULO) + 1*pow(2, nechet, MODULO) -1


ans = 1
for i in range(n):
	if not used[i]:
		if len(graph[i]) == 0:
			used[i] = True
			ans *= 2
			ans %= MODULO
		else:
			a, b = dfs_chet_nechet(i)
			ans *= (1*pow(2, a, MODULO) + 1*pow(2, b, MODULO) -1)
			# ans *= comb(i)
			ans %= MODULO

# -1 is for empty
print((ans-1+zeroes) % MODULO)