import kotlin.math.abs

val MOD = 1000000007

fun main() {
    val n = readLine()!!.toInt()

    val group = mutableMapOf<Pair<Long, Long>, Long>()
    var worstIwashiCount = 0L

    repeat(n) {
        var (a, b) = readLine()!!.split(" ").map { it.toLong() }

        if (a == 0L && b == 0L) {
            worstIwashiCount++
        } else if (a == 0L) {
            increment(0L to -1L, group)
        } else if (b == 0L) {
            increment(1L to 0L, group)
        } else {
            val gcd = gcd(a, b)
            a /= gcd
            b /= gcd
            if (a < 0) {
                a *= -1
                b *= -1
            }
            increment(a to b, group)
        }
    }
    var ans = 1L

    while (group.isNotEmpty()) {
        val (k, count) = group.entries.first()
        val (a, b) = k
        group.remove(k)

        val pairCount = if (b < 0) group.remove(-b to a) ?: 0 else group.remove(b to -a) ?: 0

        ans *= pow2(count) + pow2(pairCount) - 1
        ans %= MOD
    }
    println((ans + worstIwashiCount - 1L) % MOD)
}

fun pow2(n: Long): Long {
    tailrec fun go(n: Long, acc: Long): Long = if (n == 0L) acc else go(n - 1, acc * 2 % MOD)
    return go(n, 1)
}

fun <K> increment(key: K, m: MutableMap<K, Long>) {
    val n = m.getOrDefault(key, 0)
    m[key] = n + 1
}

fun gcd(a: Long, b: Long): Long {
    tailrec fun go(c: Long, d: Long): Long = if (d == 0L) c else go(d, c % d)
    return go(abs(a), abs(b))
}
