#include <iostream>
#include <map>
#include <vector>

__int64 gcd(__int64 a,__int64 b){
  __int64 r=a%b;
  while(r!=0){
   //std::cout<<a<<" "<<b<<" "<<r<<std::endl;
   a=b;
   b=r;
   r=a%b;
  }
  return b;
}

 __int64 pow(__int64 a,__int64 b, __int64 d){
  if(b==1){
   return a%d;
  }else if(b==0){
   return 1;
  }else{
   a=a%d;
   a=(a*a)%d;
   if(b%2==0){
    return pow(a,b/2,d);
   }else{
    return (pow(a,b/2,d)*a)%d;
   }
  }
 }

int main(){

 int N;
 std::cin>>N;
 std::map<std::pair<__int64,__int64>,int> mp;

 __int64 a,b;
 __int64 zero=0;
 for(int i=0;i<N;i++){
  std::cin>>a>>b;

  if(a==0&&b==0){
   zero++;
  }else if(a==0){
   mp[{0,1}]++;
  }else if(b==0){
   mp[{1,0}]++;
  }else{
   if(a<0&&b<0){
    __int64 g=gcd(-a,-b);
    mp[{(-a/g),(-b/g)}]++;
   }else if(a<0){
    __int64 g=gcd(-a,b);
    mp[{(a/g),(b/g)}]++;
   }else if(b<0){
    __int64 g=gcd(a,-b);
    mp[{(-a/g),(-b/g)}]++;
   }else{
    __int64 g=gcd(a,b);
    mp[{(a/g),(b/g)}]++;
   }
  }
 }

 __int64 d=1000000007;

 __int64 ans=1;
 __int64 al=0;
 __int64 be=0;
 __int64 ga=0;
 for(auto p:mp){
  //std::cout<<"(<"<<p.first.first<<","<<p.first.second<<">"<<","<<p.second<<")"<<std::endl;
  al=p.first.first;
  be=p.first.second;
  ga=1;
  ga+=pow(2,mp[{al,be}],d)-1;
  mp[{al,be}]=0;
  if(al>=0){
   if(mp[{-be,al}]!=0){
    ga+=pow(2,mp[{-be,al}],d)-1;
    mp[{-be,al}]=0;
   }
  }else{
   if(mp[{be,-al}]!=0){
    ga+=pow(2,mp[{be,-al}],d)-1;
    mp[{be,-al}]=0;
   }
  }
  //std::cout<<ga<<std::endl;
  ans*=ga;
  ans=ans%d;
 }
 
 ans+=zero;
 ans=ans%d;
 ans--;
 if(ans<0){
  ans+=d;
 }
 std::cout<<ans<<std::endl;
}