#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void amax(X& x, const Y& y) {
  if (x < y) x = y;
}
template <class X, class Y>
void amin(X& x, const Y& y) {
  if (x > y) x = y;
}
const int INF = 1e9 + 10;
const long long INFL = 1e18 + 10;
const int MAX = 1e6 + 10;
const int MAXP = 1e6;
long long n1, n2, n3, m1, m2, m3, s1, s2, s3, n, m, s;
int prime[MAX];
long long res;
vector<pair<int, int> > fn, fs;
vector<long long> ff;
void prime_sieve() {
  for (int i = 2; i * i <= MAXP; i++)
    if (!prime[i])
      for (int j = i; j <= MAXP / i; j++)
        if (!prime[i * j]) prime[i * j] = i;
  for (int i = 2; i <= MAXP; i++)
    if (!prime[i]) prime[i] = i;
}
vector<pair<int, int> > factor(long long x) {
  vector<pair<int, int> > res;
  while (x > 1) {
    int p = prime[x], cnt = 0;
    while (x % p == 0) {
      cnt++;
      x /= p;
    }
    res.push_back(make_pair(p, cnt));
  }
  return res;
}
vector<pair<int, int> > combine(vector<pair<int, int> > a,
                                const vector<pair<int, int> >& b) {
  for (int i = 0; i < (int)b.size(); i++) a.push_back(b[i]);
  sort(a.begin(), a.end());
  if (a.size() == 0) return a;
  int j = 1;
  for (int i = 1; i < (int)a.size(); i++) {
    if (a[i].first == a[j - 1].first)
      a[j - 1].second += a[i].second;
    else
      a[j++] = a[i];
  }
  a.resize(j);
  return a;
}
long long power(long long x, long long n) {
  if (n == 0) return 1;
  long long tmp = power(x, n / 2);
  tmp = tmp * tmp;
  if (n & 1) tmp *= x;
  return tmp;
}
vector<long long> filter(const vector<pair<int, int> >& a,
                         const vector<pair<int, int> >& b) {
  vector<long long> res;
  int i = 0, j = 0;
  while (i < (int)a.size() && j < (int)b.size()) {
    if (a[i].first == b[j].first) {
      if (a[i].second > b[j].second) {
        res.push_back(power(a[i].first, b[j].second + 1));
      }
      i++;
      j++;
    } else if (a[i].first < b[j].first) {
      res.push_back(a[i].first);
      i++;
    } else
      j++;
  }
  for (; i < (int)a.size(); i++) res.push_back(a[i].first);
  return res;
}
bool ison(int i, int x) { return (x >> i) & 1; }
void attempt(int p, long long x) {
  if (p == (int)fs.size()) {
    res += (x <= n);
    return;
  }
  long long power = 1;
  for (int i = 0; i <= fs[p].second; i++) {
    attempt(p + 1, x * power);
    power *= fs[p].first;
  }
}
void process() {
  prime_sieve();
  int t;
  cin >> t;
  while (t--) {
    cin >> n1 >> n2 >> n3;
    n = n1 * n2 * n3;
    cin >> m1 >> m2 >> m3;
    m = m1 * m2 * m3;
    cin >> s1 >> s2 >> s3;
    s = s1 * s2 * s3;
    fn = combine(factor(n1), combine(factor(n2), factor(n3)));
    fs = combine(factor(2),
                 combine(factor(s1), combine(factor(s2), factor(s3))));
    ff = filter(fn, fs);
    int nff = ff.size();
    res = 0;
    for (int ms = 1; ms < (1 << nff); ms++) {
      long long x = 1;
      int cnt = 0;
      for (int i = 0; i < nff; i++)
        if (ison(i, ms)) {
          x *= ff[i];
          cnt++;
        }
      res += ((cnt & 1) ? 1 : -1) * (m / x);
    }
    res = m - res;
    attempt(0, 1);
    cout << res << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  process();
}
