#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
bool flag[maxn];
int pri[maxn];
int cnt = 0;
void GetPrime() {
  for (int i = 2; i < maxn; ++i) {
    if (!flag[i]) pri[cnt++] = i;
    for (int j = 0; j < cnt && 1LL * pri[j] * i < maxn; ++j) {
      flag[pri[j] * i] = 1;
      if (i % pri[j] == 0) break;
    }
  }
}
map<int, int> sp, sn;
vector<pair<int, int> > sf;
vector<long long> sg;
long long n, m, ss, ans1, ans2;
bool mod(long long x, long long p) {
  long long y = x / p;
  return (p * y == x);
}
void dfs1(int k, long long s) {
  if (s > n) return;
  if (k == -1) {
    ans1++;
    return;
  }
  dfs1(k - 1, s);
  for (int i = 0; i < sf[k].second; i++) {
    s *= sf[k].first;
    dfs1(k - 1, s);
  }
}
void dfs2(int k, long long s, int u) {
  if (k == -1) {
    ans2 += m / s * u;
    return;
  }
  dfs2(k - 1, s, u);
  dfs2(k - 1, s * sg[k], -u);
}
int main() {
  int t, i, j, x;
  scanf("%d", &t);
  GetPrime();
  while (t--) {
    sp.clear();
    sn.clear();
    sp[2] = 1;
    n = m = 1;
    ss = 2;
    for (i = 0; i < 3; i++) {
      scanf("%d", &x);
      n *= x;
      for (j = 0; j < cnt && x > 1; j++) {
        while (mod(x, pri[j])) {
          sn[pri[j]]++;
          x /= pri[j];
        }
      }
    }
    for (i = 0; i < 3; i++) {
      scanf("%d", &x);
      m *= x;
    }
    for (i = 0; i < 3; i++) {
      scanf("%d", &x);
      ss *= x;
      for (j = 0; j < cnt && x > 1; j++) {
        while (mod(x, pri[j])) {
          sp[pri[j]]++;
          x /= pri[j];
        }
      }
    }
    sf.clear();
    sg.clear();
    for (auto e : sp) sf.push_back(pair<int, int>(e.first, e.second));
    j = sf.size();
    ans1 = ans2 = 0;
    dfs1(j - 1, 1);
    for (auto e : sn) {
      long long y = e.first;
      for (i = 0; i < e.second; i++) {
        if (!mod(ss, y)) {
          sg.push_back(y);
          break;
        }
        y *= e.first;
      }
    }
    j = sg.size();
    dfs2(j - 1, 1, 1);
    printf("%I64d\n", ans1 + ans2);
  }
  return 0;
}
