#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << '{';
  for (int i = (0), __i = (((int)(vec).size())); i < __i; i++) {
    os << vec[i];
    if (i + 1 != ((int)(vec).size())) os << ',';
  }
  os << '}';
  return os;
}
template <class T1, class T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &par) {
  os << '(' << par.first << ',' << par.second << ')';
  return os;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : abs(x); }
template <class T>
T sqr(T x) {
  return x * x;
}
long long dat[3][4];
bool simple[1000010];
int F = 0;
long long factor[100000];
long long cnt[1000010];
long long prod[1000010];
int used[3][20];
int factcnt[3][100000];
int factnum[3];
long long get_val(long long cur, long long maxval, int f) {
  if (cur > maxval) return 0;
  if (f == factnum[2]) return 1;
  long long res = 0;
  for (int i = (0), __i = (factcnt[2][used[2][f]] + 1); i < __i; i++) {
    res += get_val(cur, maxval, f + 1);
    cur *= factor[used[2][f]];
  }
  return res;
}
int findid(int simp) {
  int l = -1, r = F;
  while (l + 1 < r) {
    int m = (l + r) / 2;
    if (factor[m] < simp)
      l = m;
    else
      r = m;
  }
  return r;
}
int main() {
  ios::sync_with_stdio(false);
  cnt[0] = 0;
  for (int i = (1), __i = (1000010); i < __i; i++) {
    cnt[i] = cnt[i & (i - 1)] + 1;
    simple[i] = true;
  }
  for (int i = (2), __i = (1000010); i < __i; i++) {
    if (simple[i]) {
      factor[F++] = i;
      for (int j = 2 * i; j < 1000010; j += i) simple[j] = false;
    }
  }
  int T;
  cin >> T;
  for (int t = (0), __t = (T); t < __t; t++) {
    for (int i = (0), __i = (3); i < __i; i++) {
      dat[i][0] = 1;
      for (int j = (0), __j = (3); j < __j; j++) {
        cin >> dat[i][j + 1];
        dat[i][0] *= dat[i][j + 1];
      }
    }
    dat[2][1] <<= 1;
    for (int f = (0), __f = (F); f < __f; f++) {
      if (factor[f] > 1000) break;
      for (int i = (0), __i = (3); i < __i; i++)
        for (int j = (1), __j = (4); j < __j; j++)
          while ((dat[i][j] % factor[f]) == 0) {
            if (factcnt[i][f]++ == 0) used[i][factnum[i]++] = f;
            dat[i][j] /= factor[f];
          }
    }
    for (int i = (0), __i = (3); i < __i; i++) {
      sort(dat[i] + 1, dat[i] + 4);
      for (int j = (1), __j = (4); j < __j; j++)
        if (dat[i][j] > 1) {
          used[i][factnum[i]] = findid(dat[i][j]);
          factcnt[i][used[i][factnum[i]++]]++;
        }
    }
    vector<long long> a;
    int j = 0;
    for (int i = (0), __i = (factnum[0]); i < __i; i++) {
      while (j < factnum[2] && used[2][j] < used[0][i]) j++;
      if (j == factnum[2] || used[2][j] > used[0][i])
        a.push_back(factor[used[0][i]]);
      else if (factcnt[0][used[0][i]] > factcnt[2][used[0][i]])
        a.push_back(powl(factor[used[0][i]], factcnt[2][used[0][i]] + 1));
    }
    prod[0] = 1;
    for (int i = (0), __i = (((int)(a).size())); i < __i; i++)
      prod[1LL << i] = a[i];
    long long res = dat[1][0];
    for (int i = (1), __i = (1LL << ((int)(a).size())); i < __i; i++) {
      prod[i] = prod[i & (i - 1)] * prod[i & ~(i - 1)];
      if (cnt[i] & 1)
        res -= dat[1][0] / prod[i];
      else
        res += dat[1][0] / prod[i];
    }
    res += get_val(1, dat[0][0], 0);
    cout << res << endl;
    for (int i = (0), __i = (3); i < __i; i++) {
      for (int j = (0), __j = (factnum[i]); j < __j; j++)
        factcnt[i][used[i][j]] = 0;
      factnum[i] = 0;
    }
  }
  return 0;
}
