#include <bits/stdc++.h>
using namespace std;
struct node {
  long long x, y, z;
} a[203040];
long long n, k, d, r, h, p, ans, b[203040], c[203040];
bool cmp(node u, node v) {
  if (u.x != v.x)
    return u.x < v.x;
  else
    return u.y < v.y;
}
bool comp(long long u, long long v, long long w, long long z) {
  if ((u % 1000000007) * (v % 1000000007) % 1000000007 !=
      (w % 1000000007) * (z % 1000000007) % 1000000007)
    return 1;
  if ((u % 1000000009) * (v % 1000000009) % 1000000009 !=
      (w % 1000000009) * (z % 1000000009) % 1000000009)
    return 1;
  if ((u % 998244353) * (v % 998244353) % 998244353 !=
      (w % 998244353) * (z % 998244353) % 998244353)
    return 1;
  return 0;
}
long long gcd(long long x, long long y) {
  if (x % y == 0)
    return y;
  else
    return gcd(y, x % y);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].z);
  sort(a, a + n, cmp);
  r = 1;
  while (r < n && a[r].x == a[r - 1].x) r++;
  for (int i = 0; i < r; i++) b[i] = a[i].y, c[i] = a[i].z;
  if (n % r != 0) {
    printf("0\n");
    return 0;
  }
  h = n / r;
  for (int i = 1; i < h; i++)
    for (int j = 0; j < r; j++)
      if (a[i * r + j].y != b[j]) {
        printf("0\n");
        return 0;
      }
  for (int i = 1; i < h; i++)
    for (int j = 1; j < r; j++)
      if (a[i * r + j].x != a[i * r + j - 1].x) {
        printf("0\n");
        return 0;
      }
  for (int i = 1; i < h; i++)
    for (int j = 1; j < r; j++)
      if (comp(a[i * r + j].z, c[0], a[i * r].z, c[j])) {
        printf("0\n");
        return 0;
      }
  p = a[0].z;
  for (int i = 1; i < n; i++) p = gcd(p, a[i].z);
  for (long long j = 1; j * j <= p; j++) {
    if (p % j == 0) {
      ans++;
      if (j * j < p) ans++;
    }
  }
  cout << ans << endl;
  return 0;
}
