#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
//#define ll long long
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
#define rep(i, n) REP(i, 0, n)
#define rep_rev(i, n) for (int (i) = (int)(n) - 1 ; (i) >= 0 ; --(i))
#define ALL(v) v.begin(), v.end()
#define MSG(a) cout << #a << " " << a << endl;
#define REP(i, x, n) for(int i = x; i < n; i++)
#define all(x) (x).begin(),(x).end()
ll t1,t2,t3;
const ll mod = 1000000007;
const int INF = 1e9;
const ll INFLONG = 1e18;

int main(){
//  ll n;
//  cin >> n;
//  vector<pair<ll,ll>> vec;
//  vector<ll> ch(n,0);
//  ll sum1 = 0;
//  ll sum2 = 0;
//  ll sum3 = 0;
//  vector<ll> arr(n+1);
//  ll p = 1;
//  arr[0] = 1;
//  rep(i,n){
//    arr[i+1] = arr[i] * 2;
//    arr[i+1] %= mod;
//  }
//  ll ans = 0;
//  map<pair<ll,ll>,ll> mp;
//  ll cou = 0;
//  pair<ll,ll> pa1,pa2,pa3;
//  rep(i,n){
//    cin >> t1 >> t2;
//    if(t1 < 0){
//      t1 *= -1;
//      t2 *= -1;
//    }
//
//    if(t1 != 0 && t2 != 0){
//      t3 = gcd(t1,t2);
//      t1 /= t3;
//      t2 /= t3;
//    }
//    pa1 = make_pair(t1,t2);
//    mp[pa1]++;
//  }
//  for(auto itr:mp){
//    t1 = itr.first.first;
//    t2 = itr.first.second;
//    pa2 = make_pair(t2,-t1);
//    pa3 = make_pair(-t2,t1);
//    ans += (arr[itr.second]-1) * arr[n - itr.second - mp[pa2] + mp[pa3]];
//    ans %= mod;
//    cout << t1 << " " << t2 << " " << arr[itr.second] << "  " << arr[mp[pa2] + mp[pa3]] << endl;
//  }
//  cout << ans << endl;

  ll n;
  cin >> n;
  map<pair<ll,ll>,pair<ll,ll>> M;
  vector<ll> p2(n+1);
  ll p = 1;
  p2[0] = 1;
  rep(i,n){
    p2[i+1] = p2[i] * 2;
    p2[i+1] %= mod;
  }
  int Z;


  rep(i,n) {
    ll X,Y;
    cin>>X>>Y;
    if(X == 0 && Y == 0){
      Z++;
    }else if(X==0){
      M[{0,0}].first++;
    }else if(Y==0){
      M[{0,0}].second++;
    }else{
      if(Y < 0){
        X *= -1;
        Y *= -1;
      }
      ll g = gcd(abs(X),abs(Y));
      X /= g;
      Y /= g;
      if(X < 0){
        M[{Y,-X}].first++;// first:片方マイナスなので反転させたもの
      }else{
        M[{X,Y}].second++;
      }
    }
  }
  ll ret = 1;
  for(auto itr:M){
    //cout << itr.first.first << " " << itr.first.second << " ";
    //cout << itr.second.first << " " << itr.second.second << endl;
    ll a = p2[itr.second.first] + p2[itr.second.second]-1;
    ret = (ret*a)%mod;
    //cout << ret << endl;
  }
  cout << (ret+Z+mod-1)%mod << endl;
}
