#include using namespace std; #define double long double typedef long long ll; typedef vector vi; typedef vector vl; typedef pair pii; typedef pair pll; typedef int _loop_int; #define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i) #define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i) #define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i) #define DEBUG(x) cout<<#x<<": "< P; int n; typedef pair pdd; set yo[3]; int main(){ scanf("%d",&n); REP(i,n){ int p,a,b; scanf("%d%d%d",&p,&a,&b); int g = __gcd(a,b); a/=g; b/=g; double nor = (double)(a+b); yo[p].insert(pdd((double)a/nor,(double)b/nor)); } REP(p,3)yo[p].insert(pdd(1.0,0.0)); // ll ans = yo[0].size()*yo[1].size()*yo[2].size(); // DEBUG(ans); map rui; int it = 0; rui[-1e30] = 0; for(auto P:yo[0]){ it++; rui[P.first] = it; } it++; rui[1e30] = it; ll ans = 0; for(auto P:yo[1])for(auto Q:yo[2]){ double a1 = P.first; double a2 = Q.first; double b1 = P.second; double b2 = Q.second; // no cross if(1.0 - a2 > a1)continue; // matomete double high = 1.0; double low = max(b1,b2); // DEBUG(low); ll add = 0; auto it = rui.upper_bound(high); it--; add += it->second; it = rui.lower_bound(low-EPS); it--; add -= it->second; ans += add; // banned if(rui.count(1.0-(a1-b2))){ ans --; } } printf("%lld\n",ans); return 0; }