#include <bits/stdc++.h>
using namespace std;
const int MAX_P = 2e6 + 5;
long long factor[MAX_P];
vector<pair<long long, long long>> factorize(long long p, long long q,
                                             long long r) {
  vector<long long> fs;
  while (p != 1) {
    fs.push_back(factor[p]);
    p /= factor[p];
  }
  while (q != 1) {
    fs.push_back(factor[q]);
    q /= factor[q];
  }
  while (r != 1) {
    fs.push_back(factor[r]);
    r /= factor[r];
  }
  sort(fs.begin(), fs.end());
  vector<pair<long long, long long>> ans;
  for (long long i = 0; i < (long long)fs.size(); i++) {
    if (i == 0 || fs[i] != fs[i - 1]) {
      ans.push_back(make_pair(fs[i], 0));
    }
    ans.back().second++;
  }
  return ans;
}
long long cnt_muls(long long p, long long m) { return m / p; }
long long sgn(long long mask) {
  return (__builtin_popcount(mask) % 2) ? -1 : 1;
}
long long sub_mul(long long mask, const vector<long long> &vals) {
  long long ans = 1;
  for (long long i = 0; i < (long long)vals.size(); i++) {
    if (mask & 1 << i) {
      ans *= vals[i];
    }
  }
  return ans;
}
long long solve_a(const vector<pair<long long, long long>> &n_fs,
                  const vector<pair<long long, long long>> &S_fs, long long m) {
  vector<pair<long long, long long>> forbs;
  long long iptr = 0, jptr = 0;
  while (iptr < (long long)n_fs.size()) {
    while (jptr < (long long)S_fs.size() &&
           S_fs[jptr].first < n_fs[iptr].first) {
      jptr++;
    }
    if (jptr < (long long)S_fs.size() && S_fs[jptr].first == n_fs[iptr].first) {
      if (n_fs[iptr].second > S_fs[jptr].second) {
        forbs.push_back(S_fs[jptr]);
        forbs.back().second++;
      }
    } else {
      forbs.push_back(make_pair(n_fs[iptr].first, 1));
    }
    iptr++;
  }
  vector<long long> forb_vals;
  for (auto pr : forbs) {
    long long pw = 1;
    for (long long i = 0; i < pr.second; i++) {
      pw *= pr.first;
    }
    forb_vals.push_back(pw);
  }
  long long ans = 0;
  for (long long mask = 0; mask < 1 << (long long)forb_vals.size(); mask++) {
    ans += sgn(mask) * cnt_muls(sub_mul(mask, forb_vals), m);
  }
  return ans;
}
void solve_b_dfs(long long cur, long long id,
                 const vector<pair<long long, long long>> &S_fs, long long n,
                 long long &ans) {
  if (cur > n) {
    return;
  }
  if (id == (long long)S_fs.size()) {
    ans++;
    return;
  }
  if (id < (long long)S_fs.size()) {
    for (long long i = 0; i <= S_fs[id].second; i++) {
      solve_b_dfs(cur, id + 1, S_fs, n, ans);
      cur *= S_fs[id].first;
    }
  }
}
long long solve_b(const vector<pair<long long, long long>> &S_fs, long long n) {
  long long ans = 0;
  solve_b_dfs(1, 0, S_fs, n, ans);
  return ans;
}
void solve() {
  long long n1, n2, n3;
  cin >> n1 >> n2 >> n3;
  long long m1, m2, m3;
  cin >> m1 >> m2 >> m3;
  long long s1, s2, s3;
  cin >> s1 >> s2 >> s3;
  s1 *= 2;
  auto n_fs = factorize(n1, n2, n3);
  auto m_fs = factorize(m1, m2, m3);
  auto s_fs = factorize(s1, s2, s3);
  cout << solve_a(n_fs, s_fs, m1 * m2 * m3) + solve_b(s_fs, n1 * n2 * n3)
       << endl;
}
int main() {
  for (long long i = 2; i < MAX_P; i++) {
    if (!factor[i]) {
      for (long long j = i; j < MAX_P; j += i) {
        factor[j] = i;
      }
    }
  }
  ios::sync_with_stdio(false);
  long long testc;
  cin >> testc;
  for (long long i = 0; i < testc; i++) {
    solve();
  }
}
