#include <bits/stdc++.h>
using namespace std;
int T;
long long p[2000002LL];
long long s[2000002LL];
long long answer;
long long isnotprime[2000002LL];
long long prime[2000002LL];
long long prime_size = 0;
map<long long, long long> d_n;
map<long long, long long> d_m;
map<long long, long long> d_s;
vector<pair<long long, long long>> p_s;
vector<pair<long long, long long>> p_n;
vector<pair<long long, long long>> p_gcd;
vector<long long> gcd;
void get_prime() {
  isnotprime[0] = 1;
  isnotprime[1] = 1;
  for (long long i = 2; i < 2000002LL; ++i) {
    if (!isnotprime[i]) {
      isnotprime[i] = i;
      for (long long j = i * 1ll * i; j < 2000002LL; j += i) {
        if (!isnotprime[j]) isnotprime[j] = i;
      }
    }
  }
}
vector<pair<long long, long long>> get_pair(map<long long, long long> a) {
  vector<pair<long long, long long>> pp;
  std::map<long long, long long>::iterator it_a;
  for (it_a = a.begin(); it_a != a.end(); it_a++) {
    pp.push_back(make_pair(it_a->first, it_a->second));
  }
  return pp;
}
vector<long long> get_gcd(vector<pair<long long, long long>> a,
                          vector<pair<long long, long long>> b) {
  vector<long long> ret;
  int j = 0;
  for (int i = 0; i < a.size(); ++i) {
    while (j < b.size() && b[j].first < a[i].first) ++j;
    if (j >= b.size() || a[i].first != b[j].first) {
      ret.push_back(a[i].first);
    } else if (a[i].second > b[j].second) {
      long long param = 1;
      for (int k = 0; k <= b[j].second; ++k) param *= b[j].first;
      ret.push_back(param);
    }
  }
  return ret;
}
map<long long, long long> get_dividor(vector<long long> s) {
  map<long long, long long> temp;
  for (int i = 0; i < 3; ++i) {
    long long n = s[i];
    while (n != 1) {
      long long div = isnotprime[n];
      if (temp.find(div) == temp.end()) {
        temp[div] = 1;
      } else {
        temp[div]++;
      }
      n /= div;
    }
  }
  return temp;
}
long long get_count(long long mul, long long n, int idx) {
  long long count = 0;
  if (idx == p_s.size()) {
    return 1;
  }
  for (long long i = 0; i <= p_s[idx].second; ++i) {
    if (mul > n) return count;
    count += get_count(mul, n, idx + 1);
    mul *= p_s[idx].first;
  }
  return count;
}
void get_count2(long long m, long long mul, int idx, int tick) {
  long long count = 0;
  if (mul > m) return;
  if (idx == gcd.size()) {
    if (tick == 0)
      answer += m / mul;
    else
      answer -= m / mul;
    return;
  }
  get_count2(m, mul, idx + 1, tick);
  get_count2(m, mul * gcd[idx], idx + 1, tick ^ 1);
  return;
}
int main() {
  long long n1, n2, n3, n;
  long long m1, m2, m3, m;
  long long s1, s2, s3, s;
  long long x, y;
  get_prime();
  vector<long long> temp;
  cin >> T;
  for (int tt = 0; tt < T; ++tt) {
    answer = 0;
    cin >> n1 >> n2 >> n3;
    temp.push_back(n1);
    temp.push_back(n2);
    temp.push_back(n3);
    n = n1 * n2 * n3;
    p_n = get_pair(get_dividor(temp));
    temp.clear();
    cin >> m1 >> m2 >> m3;
    m = m1 * m2 * m3;
    cin >> s1 >> s2 >> s3;
    temp.push_back(2 * s1);
    temp.push_back(s2);
    temp.push_back(s3);
    s = s1 * s2 * s3;
    p_s = get_pair(get_dividor(temp));
    temp.clear();
    gcd = get_gcd(p_n, p_s);
    answer += get_count(1, n, 0);
    get_count2(m, 1, 0, 0);
    cout << answer << endl;
  }
}
