#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int n, i, j, t;
long long a[N][3];
long long q, ans;
int b[N];
bool flag, bz[N];
void swap(long long &a, long long &b) {
  long long t = a;
  a = b, b = t;
}
void qsort(int l, int r) {
  int i = l, j = r, t = (l + r) >> 1;
  long long mid = a[t][1], mid2 = a[t][2];
  while (i <= j) {
    while (a[i][1] < mid || (a[i][1] == mid && a[i][2] < mid2)) i++;
    while (a[j][1] > mid || (a[j][1] == mid && a[j][2] > mid2)) j--;
    if (i <= j) {
      swap(a[i][1], a[j][1]), swap(a[i][2], a[j][2]);
      swap(a[i][0], a[j][0]), i++, j--;
    }
  }
  if (l < j) qsort(l, j);
  if (i < r) qsort(i, r);
}
long long gcd(long long a, long long b) { return !a ? b : gcd(b % a, a); }
int main() {
  scanf("%d", &n), flag = 1;
  for (i = 1; i <= n; i++)
    scanf("%I64d%I64d%I64d", &a[i][1], &a[i][2], &a[i][0]);
  qsort(1, n), t = 1, b[1] = 1;
  for (i = 2; i <= n; i++)
    if (a[i][1] != a[i - 1][1]) b[++t] = i;
  b[t + 1] = n + 1;
  for (i = 3; i <= t + 1; i++)
    if (b[i] - b[i - 1] != b[i - 1] - b[i - 2]) {
      flag = 0;
      break;
    }
  if (flag) {
    for (i = 0; i <= b[2] - 2; i++) {
      long long p = a[b[1] + i][2];
      for (j = 2; j <= t; j++)
        if (p != a[b[j] + i][2]) {
          flag = 0;
          break;
        }
      if (!flag) break;
    }
  }
  if (flag) {
    for (j = 2; j <= t; j++) {
      long double p = (double)a[b[j - 1]][0] / a[b[j]][0];
      for (i = 1; i <= b[2] - 2; i++)
        if (p != (double)a[b[j - 1] + i][0] / a[b[j] + i][0]) {
          flag = 0;
          break;
        }
      if (!flag) break;
    }
  }
  if (!flag)
    printf("0");
  else {
    for (i = 1; i <= n; i++) q = gcd(a[i][0], q);
    for (i = 1; (long long)i * i < q; i++)
      if (!(q % i)) ans += 2;
    if (i * i == q) ans++;
    printf("%d", ans);
  }
}
