/*
[ ( ^ _ ^ ) ]
*/
// problem: atc/abc168_e
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 1000000000

const int mod = 1000000007;

int main() {
    int n;
    scanf("%d", &n);
    vector<ll> a(n), b(n);
    map<pair<ll, ll>, int> m;
    int zero = 0;
    for(int i=0; i<n; i++) {
        scanf("%lld %lld", &a[i], &b[i]);
        if(a[i]==0 && b[i]==0) {
            zero++;
            continue;
        }
        ll g = gcd(a[i], b[i]);
        a[i] /= g;
        b[i] /= g;
        if(a[i]<0) a[i] = abs(a[i]), b[i] *= -1;
        if(a[i]==0 && b[i]<0) b[i] = abs(b[i]);
        m[{a[i], b[i]}]++;
    }
    ll rs = 1;
    while(0 < (int)size(m)) {
        auto [p, c] = *m.begin();
        auto [x, y] = p;
        auto u = y, v = -x;
        if(u<0) u = abs(u), v *= -1;
        if(u==0 && v<0) v = abs(v);

        if(m.find({u, v}) != m.end()) {
            int d = m[{u, v}];
            rs *= pow(2, c) + pow(2, d) - 1;
            m.erase({u, v});
        } else {
            rs *= pow(2, c);
        }
        m.erase(p);
        rs %= mod;
        if(rs<0) rs += mod;
    }
    printf("%lld\n", rs-1+zero);
}
