#include <bits/stdc++.h>

#define MAX_N 200000

using namespace std;

typedef long long lint;

const lint MOD = (lint)(1e9) + 7;

int n;

struct elem
{
    lint a, b;
    double c;
};

elem v[MAX_N + 1];

unordered_map <double, int> ap;

struct cmp
{
    bool operator() (const elem &x, const elem &y)
    {
        return x.a * y.b < x.b * y.a;
    }
};

lint p2[MAX_N + 1];

int main()
{
    lint ab = 0, a = 0, b = 0;
    cin >> n;
    for(int i = 1; i <= n; i ++)
    {
        cin >> v[i].a;
        cin >> v[i].b;

        if(v[i].b == 0 || v[i].a == 0)
        {
            if(v[i].a == 0 && v[i].b == 0)
                ab ++;

            else
                if(v[i].a == 0)
                    a ++;

            else
                if(v[i].b == 0)
                    b ++;
        }

        else
        {
            lint x = __gcd(v[i].a, v[i].b);

            v[i].a /= x;
            v[i].b /= x;

            v[i].c = 1.0D * v[i].a / v[i].b;

            ap[v[i].c] ++;
        }
    }

    sort(v + 1, v + n + 1, cmp());

    p2[0] = 1;
    for(int i = 1; i <= n; i ++)
        p2[i] = p2[i - 1] * 2 % MOD;

    lint rez = 1;
    lint ant = 1;
    for(int i = 1; i <= n; i ++)
    {
        if(v[i].a != 0 && v[i].b != 0 && ap[v[i].c] > 0)
        {
            if(ap[-1.0D / v[i].c] == 0)
            {
              //  cout << " PENTRU " << v[i].a << " " << v[i].b << " NU ESTE OPUS \n";

                rez = rez * p2[ap[v[i].c]] % MOD;
            }

            else if(v[i].c > 0)
            {
                lint n1 = ap[v[i].c];
                lint n2 = ap[-1.0D / v[i].c];
                rez = rez * (p2[n1] + p2[n2] - 1) % MOD;

               // cout << "PENTUR " << v[i].a << " " << v[i].b << " ESTE " << n1 << " " << n2 << "\n";

                ap[-1.0D / v[i].c] = 0;
                ap[v[i].c] = 0;
            }
        }

    }

    rez = rez * (p2[a] + p2[b] - 1) % MOD;
    rez = (rez + ab) % MOD;


    rez --;
    if(rez < 0)
        rez += MOD;

    cout << rez << "\n";

    return 0;
}
