using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
	static void Main() => new Program().Solve();

	void Solve()
	{
		var n = ReadLong();

		var d1 = new Dictionary<string, long>();
		var d2 = new Dictionary<string, long>();
		var size00 = 0L;

		for (var i = 0; i < n; i++) {
			var t = ReadLongArray();
			var a = Math.Abs(t[0]);
			var b = Math.Abs(t[1]);
			string key;
			if (a == 0 && b == 0) {
				size00++;
				continue;
			} else if (a == 0) {
				key = "0/1";
			} else if (b == 0) {
				key = "1/0";
			} else {
				var k = (a > b) ? gcd(a, b) : gcd(b, a);
				key = (a / k) + "/" + (b / k);
			}
			if (t[0] >= 0 ^ t[1] >= 0) {
				if (!d1.ContainsKey(key)) d1[key] = 0;
				d1[key]++;
			} else {
				if (!d2.ContainsKey(key)) d2[key] = 0;
				d2[key]++;
			}
		}

		modlong size = 1;

		foreach (var key in d1.Keys) {
			var rev = string.Join("/", key.Split('/').Reverse());
			if (d2.ContainsKey(rev)) {
				size *= modlong.Pow(2, d1[key]) + modlong.Pow(2, d2[rev]) - 1;
				d2.Remove(rev);
			} else {
				size *= modlong.Pow(2, d1[key]);
			}
		}

		foreach (var key in d2.Keys) {
			size *= modlong.Pow(2, d2[key]);
		}

		Console.WriteLine((long)size - 1 + size00);
	}

	/// <summary>最大公約数</summary>
	long gcd(long a, long b) => (a == 0) ? b : gcd(b % a, a);

	#region Console.Read 関係
	long[] ReadLongArray() => Array.ConvertAll(Console.ReadLine().Split(), long.Parse);
	long ReadLong() => long.Parse(Console.ReadLine());
	#endregion
}

class modlong
{
	const long M = 1000000007;
	readonly long value;
	modlong(long a) => value = a;
	public static modlong Pow(long a, long n)
	{
		var res = 1L;
		for (; n > 0; n >>= 1) {
			if ((n & 1) != 0) res = res * a % M;
			a = a * a % M;
		}
		return res;
	}
	public static implicit operator modlong(long a) => new modlong(a);
	public static explicit operator long(modlong a) => a.value;
	public static modlong operator +(modlong a, modlong b) => (a.value + b.value) % M;
	public static modlong operator -(modlong a, modlong b) => (a.value + M - b.value) % M;
	public static modlong operator *(modlong a, modlong b) => (a.value * b.value) % M;
}
