#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 1;
const long long mod = 998244353;
vector<int> g[N];
int pri[N], count[N], pos[N], st[N], tot;
long long d[N * 4], num[20], nn;
vector<int> n, s;
vector<pair<int, int> > np, sp;
void getprime() {
  for (int i = (2); i < (N); ++i) {
    if (!pri[i]) pri[++pri[0]] = i, g[i].push_back(i);
    for (int j = 1; j <= pri[0] && pri[j] * i < N; ++j) {
      pri[pri[j] * i] = 1;
      g[pri[j] * i] = g[i];
      g[pri[j] * i].push_back(pri[j]);
      if (i % pri[j] == 0) break;
    }
  }
}
long long get(long long m) {
  long long res = 0;
  tot = 0;
  int i = 0, j = 0;
  while (i < np.size() && j < sp.size()) {
    if (np[i].first < sp[j].first) {
      num[tot++] = np[i].first;
      ++i;
    } else if (np[i].first > sp[j].first)
      ++j;
    else {
      if (sp[j].second < np[i].second) {
        long long a = 1;
        for (int i = (0); i < (sp[j].second + 1); ++i) a *= sp[j].first;
        num[tot++] = a;
      }
      ++i, ++j;
    }
  }
  while (i < np.size()) {
    num[tot++] = np[i].first;
    ++i;
  }
  d[0] = 1;
  res += m;
  for (int i = (1); i < (1 << tot); ++i) {
    d[i] = d[i ^ (((i) & (-i)))] * num[pos[((i) & (-i))]];
    if (st[i])
      res -= m / d[i];
    else
      res += m / d[i];
  }
  return res;
}
long long dfs(long long d, int pos) {
  if (pos == sp.size()) return 1;
  if (sp[pos].first * d > nn) return 1;
  long long res = 0;
  for (int i = (0); i < (sp[pos].second + 1); ++i) {
    res += dfs(d, pos + 1);
    if (sp[pos].first > nn / d)
      break;
    else
      d *= sp[pos].first;
  }
  return res;
}
int main() {
  getprime();
  for (int i = (0); i < (N); ++i) st[i] = st[i >> 1] ^ (i & 1);
  for (int i = 0; (1 << i) < N; ++i) pos[1 << i] = i;
  int t;
  scanf("%d", &t);
  int k = 0, flag;
  while (t--) {
    ++k;
    long long n1, n2, n3, m1, m2, m3, s1, s2, s3;
    scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld", &n1, &n2, &n3, &m1, &m2, &m3,
          &s1, &s2, &s3);
    n.clear(), s.clear();
    for (auto v : g[n1]) n.push_back(v);
    for (auto v : g[n2]) n.push_back(v);
    for (auto v : g[n3]) n.push_back(v);
    s.push_back(2);
    for (auto v : g[s1]) s.push_back(v);
    for (auto v : g[s2]) s.push_back(v);
    for (auto v : g[s3]) s.push_back(v);
    sort(n.begin(), n.end());
    sort(s.begin(), s.end());
    np.clear();
    if (n.size()) {
      int p = n[0], cnt = 0;
      for (int i = (0); i < (n.size()); ++i) {
        if (n[i] != p) {
          np.push_back({p, cnt});
          p = n[i], cnt = 1;
        } else {
          ++cnt;
        }
      }
      np.push_back({p, cnt});
    }
    sp.clear();
    if (s.size()) {
      int p = s[0], cnt = 0;
      for (int i = (0); i < (s.size()); ++i) {
        if (s[i] != p) {
          sp.push_back({p, cnt});
          p = s[i], cnt = 1;
        } else {
          ++cnt;
        }
      }
      sp.push_back({p, cnt});
    }
    long long ans = get(m1 * m2 * m3);
    nn = n1 * n2 * n3;
    ans += dfs(1, 0);
    printf("%lld\n", ans);
  }
}
