#include <bits/stdc++.h>
using namespace std;
typedef long long lli;
typedef long double lld;
#define mod 1000000007
#define mod2 998244353
#define fori(n) for (int i = 0; i < n; i++)
#define forj(n) for (int j = 0; j < n; j++)
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define endl "\n"
#define sortvec(a) sort(a.begin(), a.end())
#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl
#define cerr if(true)cerr

template <typename T, typename U>
ostream &operator<<(ostream &out, const pair<T, U> &p)
{
    out << "(" << p.first << ", " << p.second << ")";
    return out;
}
template <template <typename, typename...> class ContainerType, typename ValueType, typename... Args>
void print(const ContainerType<ValueType, Args...> &c)
{
    for (const auto &v : c)
        cout << v << ' ';
    cout << '\n';
}

void print() { cout << '\n'; }
template <typename T, typename... Args>
void print(T a, Args... args)
{
    cout << a << " ";
    print(args...);
}

lli llipower(lli x, lli y, lli p = LLONG_MAX)
{
    lli res = 1;
    x = x % p;
    while (y > 0)
    {
        if (y & 1) res = (res * x) % p;
        y = y >> 1;
        x = (x * x) % p;
    }
    return res;
}
lli binarySearch(vector<int> arr, int l, int r, int x)
{
    if (r >= l)
    {
        lli mid = l + (r - l) / 2;
        if (arr[mid] == x)
            return mid;
        if (arr[mid] > x)
            return binarySearch(arr, l, mid - 1, x);
        return binarySearch(arr, mid + 1, r, x);
    }
    return -1;
}

//---------------------------------------------------------------------------------

int main()
{
    // int t,tt;
    // cin >> t;
    // tt=t;
    // while (t--)
    // {
    //     int n;
    //     cin>>n;
    //     vector<int> a(n);
    //     fori(n) cin>>a[i];
    //     vector<int> pref(n+1,0);
    //     int sumv=0;
    //     fori(n){
    //         sumv+=a[i];
    //         pref[i+1]=sumv;
    //     }
    //     vector<int> sqs;
    //     fori(10000){
    //         if(i*i<=10000099) sqs.pb(i*i);
    //     }
    //     int curr;
    //     int ans=0;
    //     for(int i=1;i<=n;i++){
    //         curr=pref[i];
    //         for(auto j:sqs){
    //             if(binarySearch(pref,0,n,pref[i]-j)!=-1 &&){
    //                 ans++;
    //                 cout<<i<<" "<<j<<endl;
    //             }
    //         }
    //     }

        
    //     cout<<"Case #"<<tt-t<<": "<<ans<<endl;
    // }
    lli n;
    lli x,y,g;
    
    cin>>n;
    vector<pair<lli, lli>> p(n);
    map<pair<lli, lli>, lli> mps;
   // cout<<__gcd((lli)-1e18,(lli)1e18);
    lli c=0;
    fori(n){
        cin>>x>>y;
        if(x==0 && y==0){
            c++;
            continue;
        }
        if((y<0)){
            x*=-1;
            y*=-1;
        }
        g = __gcd(x, y);
        x/=g;
        y/=g;
        //cout<<x<<" "<<y<<endl;
        p[i]=(mp(x,y));
        mps[p[i]]++;
    }
    

   
    lli ans=1;

    fori(n){
        x=0;
        if(mps.count(p[i]))
            x=mps[p[i]];
        y=0;
        if (mps.count(mp(-1 * p[i].S, p[i].F)))
            y+=mps[mp(-1 * p[i].S, p[i].F)];
        if (mps.count(mp(p[i].S, -1 * p[i].F)))
            y+=mps[mp(p[i].S, -1 * p[i].F)];
        
       // print(p[i],x,y,ans);

        ans=ans*((llipower(2,x,mod)+llipower(2,y,mod)+mod-1)%mod);
        ans%=mod;
            
        if(mps.count(p[i]))
            mps[p[i]] = 0LL;
        if (mps.count(mp(-1 * p[i].S, p[i].F)))
            mps[mp(-1 * p[i].S, p[i].F)] = 0LL;
        if (mps.count(mp(p[i].S, -1 * p[i].F)))
            mps[mp(p[i].S, -1 * p[i].F)] = 0LL;
    }
    cout<<(ans+mod-1+c)%mod<<endl;
}

Measured memory_bytes: 18776