#include"bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp> 
using namespace __gnu_pbds; 
using namespace std;

#define double long double
#define int long long
#define pb push_back 
#define eb emplace_back
#define Z(c) (int)(c).size()
#define L(c) c[Z(c)-1]
#define F first
#define S second
#define nl "\n"
#define mii map<int,int>
#define sp fixed<<setprecision 
#define all(c) (c).begin(),(c).end()
#define rall(c) (c).rbegin(),(c).rend()
#define rep(i,iv,n) for(int (i)=(iv);(i)<(n);++(i))
#define FO fflush(stdout) 
#define D1(x) cerr <<"At line "<<__LINE__<<" "<<#x<<"="<<x<<nl
#define D2(x,y) cerr <<"At line "<<__LINE__<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<nl
#define D3(x,y,z) cerr <<"At line "<<__LINE__<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<nl
#define tr(it,ct) for(auto &(it) : (ct))
#define pi acos(-1)
#define prt(ct) for(auto &(it) : (ct)) cerr<<it<<" "; cerr<<nl
#define prtp(ct) for(auto &(it) : (ct)) cerr<<it.F<<" "<<it.S<<nl; cerr<<nl

typedef vector< int > vi;
typedef vector< vi > vvi;
typedef pair< int,int > pii;
typedef pair<pii,pii> ppp;
typedef vector< pii > vp;
typedef tree<pii, null_type, less<pii>, rb_tree_tag, 
             tree_order_statistics_node_update> baap;

void swap(char &a,char &b)
{ auto tm=a; a=b; b=tm; }

void mina(int &a,int b)
{ a=(a<b?a:b); }

void maxa(int &a,int b)
{ a=(a>b?a:b); }
  
  const int mod=1000000007;
  const int mod2=998244353;
  const int INF=1e18;
  const int N=2e5+25;
  const int M=1e9;
 
  int power(int a,int n,int lelo)
  {
          if(n==0)
                  return 1;
          if(n==1)
                  return a;
          if(n==2)
                  return (a*a)%lelo;
          if(n%2)
                  return (a*power(a,n-1,lelo))%lelo;
          else
                  return power(power(a,n/2,lelo),2,lelo)%lelo;
  }

 void doit()
 {
   int n; cin>>n; vp a(n); vi g; vector<bool> p;

   map<pair<bool,pii>,int> m;
   tr(i,a){
     cin>>i.F>>i.S;
     int gcd=__gcd(i.F,i.S);
     i.F/=gcd; i.S/=gcd;
     g.pb(gcd); if(i.F>=0&&i.S>=0||i.F<0&&i.S<0) p.pb(1); else p.pb(0);
     i.F=abs(i.F); i.S=abs(i.S);
     m[{!p.back(),{i.S,i.F}}]++;
   }

   int ans=0;
 /*  
   tr(i,m){
      cout<<i.F.F<<" "<<i.F.S.F<<" "<<i.F.S.S<<" "<<i.S<<nl;
   }
   */
   for(int i=0;i<n;++i){
      int tot=n-i-1;
      tot-=m[{p[i],a[i]}];
      // D2(i,tot);
      ans=(ans + power(2,tot,mod))%mod;
      m[{!p[i],{a[i].S,a[i].F}}]--;
   }

   cout<<ans;

 }

signed main()
{ 
   ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

   int tc=1;                         
  // cin>>tc;

  rep(i,1,tc+1)
  { // cout<<"Case #"<<i<<": ";
  
   doit();
   if(i<tc)
   cout<<nl;
  }
  
 return 0; 
}