#include <bits/stdc++.h>
using namespace std;
int n, ans, tot, flag;
long long num[200005], tmp;
struct info {
  long long a, b, c;
  bool operator<(const info &p) const {
    return a < p.a || (a == p.a && b < p.b);
  }
} t[200005];
struct node {
  long long b, c;
};
vector<node> s[200005];
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
int main() {
  long long a, b, c;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%I64d%I64d%I64d", &a, &b, &c);
    t[i] = (info){a, b, c};
  }
  sort(t + 1, t + n + 1);
  for (int i = 1; i <= n; i++) {
    if (t[i].a != t[i - 1].a) tot++;
    s[tot].push_back((node){t[i].b, t[i].c});
  }
  for (int i = 0; i < s[1].size(); i++) tmp = gcd(tmp, s[1][i].c);
  for (int i = 0; i < s[1].size(); i++) num[i] = s[1][i].c / tmp;
  for (int i = 2; i <= tot && !flag; i++) {
    if (s[i].size() != s[i - 1].size()) {
      flag = 1;
      break;
    }
    for (int j = 0; j < s[i].size(); j++)
      if (s[i][j].b != s[i - 1][j].b) {
        flag = 1;
        break;
      }
    if (s[i][0].c % num[0]) {
      flag = 1;
      break;
    }
    long long res = s[i][0].c / num[0];
    for (int j = 1; j < s[i].size() && !flag; j++)
      if (s[i][j].c / num[j] != res) {
        flag = 1;
        break;
      }
  }
  if (flag) {
    printf("0\n");
    return 0;
  }
  tmp = 0;
  for (int i = 1; i <= tot; i++) tmp = gcd(tmp, s[i][0].c / num[0]);
  for (int i = 1; (long long)i * i <= tmp; i++) {
    if (tmp % i) continue;
    ans++;
    if ((long long)i * i < tmp) ans++;
  }
  printf("%d\n", ans);
  return 0;
}
