#include <bits/stdc++.h>
using namespace std;
vector<int> c;
vector<int> p;
vector<int> st;
vector<int> used;
vector<int> pos;
void dfs(int v) {
  if (used[v]) return;
  used[v] = 1;
  st.push_back(c[pos[v]]);
  dfs(pos[v]);
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n;
    cin >> n;
    p.assign(n + 1, 0);
    c.assign(n + 1, 0);
    used.assign(n + 1, 0);
    pos.assign(n + 1, 0);
    for (int i = 1; i < n + 1; i++) {
      cin >> p[i];
      pos[p[i]] = i;
    }
    for (int i = 1; i < n + 1; i++) {
      cin >> c[i];
    }
    int ans = 1e9 + 7;
    for (int i1 = 1; i1 < n + 1; i1++) {
      if (!used[i1]) {
        dfs(i1);
        int m = st.size();
        vector<int> v;
        for (int i = 1; i * i <= m; i++) {
          if (i > ans) break;
          if (m % i == 0) {
            for (int j = 0; j < i; j++) {
              bool f = false;
              for (int k = j + i; k < st.size(); k += i) {
                if (st[k] != st[j]) {
                  f = true;
                  break;
                }
              }
              if (!f) {
                ans = min(ans, i);
                break;
              }
            }
            v.push_back(m / i);
          }
        }
        reverse(v.begin(), v.end());
        for (auto& q : v) {
          if (q > ans) break;
          for (int j = 0; j < q; j++) {
            bool f = false;
            for (int k = j + q; k < st.size(); k += q) {
              if (st[k] != st[j]) {
                f = true;
                break;
              }
            }
            if (!f) {
              ans = min(ans, q);
              break;
            }
          }
        }
      }
      st.clear();
    }
    cout << ans << "\n";
  }
}
