#include <bits/stdc++.h>   namespace fastIO {   static const int IN_BUF = 1 << 23, OUT_BUF = 1 << 23;   char buf[IN_BUF], *ps = buf, *pt = buf;   inline char my_getchar() {     return ps == pt && (pt = (ps = buf) + fread(buf, 1, IN_BUF, stdin), ps == pt)                ? EOF                : *ps++;   }   template <typename T>   inline bool read(T &x) {     char op = 0, ch = my_getchar();     for (x = 0; !isdigit(ch) && ch != EOF; ch = my_getchar())       if (ch ==  - ) op ^= 1;     if (ch == EOF) return false;     for (; isdigit(ch); ch = my_getchar()) x = x * 10 + (ch ^  0 );     if (ch !=  . )       return op ? x = -x : 0, true;     else       ch = my_getchar();     T t = 1;     for (; isdigit(ch); ch = my_getchar()) t /= 10, x += (ch ^  0 ) * t;     return op ? x = -x : 0, true;   }   inline int reads(char *s) {     int n = 0;     char ch = my_getchar();     for (; isspace(ch) && ch != EOF; ch = my_getchar())       ;     for (; !isspace(ch) && ch != EOF; ch = my_getchar()) s[n++] = ch;     return s[n] =   0 , n;   }   char pbuf[OUT_BUF], *pp = pbuf;   struct _flusher {     ~_flusher() { fwrite(pbuf, 1, pp - pbuf, stdout); }   } OutputFlusher;   inline void my_putchar(char x) {     pp == pbuf + OUT_BUF ? fwrite(pbuf, 1, OUT_BUF, stdout), pp = pbuf : 0,                                                              *pp++ = x;   }   template <typename T>   inline void print_(T x) {     if (x == 0) return my_putchar( 0 ), void(0);     std::vector<int> num;     for (x < 0 ? my_putchar( - ), x = -x : 0; x; x /= 10) num.push_back(x % 10);     while (!num.empty()) my_putchar(num.back() ^  0 ), num.pop_back();   }   template <typename T>   inline void print(T x, char ch =   n ) {     print_(x), my_putchar(ch);   }   inline void prints_(const char *s, int n = -1) {     if (n == -1) n = strlen(s);     for (register int i = 0; i < n; ++i) my_putchar(s[i]);   }   inline void prints(const char *s, int n = -1, char ch =   n ) {     prints_(s, n), my_putchar(ch);   }   template <typename T>   inline void printd_(T x, int n) {     if (x < 0) x = -x, my_putchar( - );     long long a, b;     for (register int i = 0; i < n; ++i) x *= 10;     x = (long long)(x + 0.5);     for (register int i = 0; i < n; ++i) x /= 10;     a = x, x -= a;     for (register int i = 0; i < n; ++i) x *= 10;     b = x;     print_(a);     if (n)       my_putchar( . );     else       return;     std::vector<int> num(n);     for (register int i = 0; i < n; ++i) num[i] = b % 10, b /= 10;     while (!num.empty()) my_putchar(num.back() ^  0 ), num.pop_back();   }   template <typename T>   inline void printd(T x, int n, char ch =   n ) {     printd_(x, n), my_putchar(ch);   }   }  // namespace fastIO   using namespace fastIO;   const int N = 200005;   int n, p[N], c[N], vis[N];   int solve(std::vector<int> &a) {     std::vector<int> d;     int l = a.size();     for (register int i = 1; 1ll * i * i <= l; ++i)       if (l % i == 0) {         d.push_back(i);         if (i * i < l) d.push_back(l / i);       }     std::sort(d.begin(), d.end());     for (int k : d) {       for (register int i = 0; i < k; ++i) {         bool flag = 1;         for (register int j = i; j < l; j += k) flag &= a[j] == a[i];         if (flag) return k;       }     }     return l;   }   void solve() {     read(n);     for (register int i = 1; i <= n; ++i) read(p[i]), vis[i] = 0;     for (register int i = 1; i <= n; ++i) read(c[i]);     int ans = n;     for (register int i = 1; i <= n; ++i)       if (!vis[i]) {         std::vector<int> tmp;         tmp.push_back(c[i]), vis[i] = 1;         for (register int j = p[i]; j != i; j = p[j])           tmp.push_back(c[j]), vis[j] = 1;         ans = std::min(ans, solve(tmp));       }     print(ans);   }   int main() {     int T = 1;     read(T);     while (T--) solve();   }