#include #include using namespace std; constexpr long long M = 1e12; long long mod(long long a, long long m){ return (a%m+m)%m; } long long gcd(long long a, long long b){ return b==0 ? a : gcd(b, a%b); } long long lcm(long long a, long long b){ auto g = gcd(a,b); if(a/g > M/b) return M+1; return a/g*b; } long long mulmod(long long a, long long b, long long m){ //return __int128(a)*b%m; b%=m; long long x = 0, y=a%m; while(b>0){ if(b&1) x = (x+y)%m; y = (2*y)%m, b /= 2; } return x % m; } using T = long long; void extended_euclid(T a, T b, T& s, T& t, T& d){ if(b==0) s=a>0?1:-1, t=0, d=a<0?-a:a; else extended_euclid(b, a%b, t, s, d), t -= a/b*s; } pair crt(T a1, T m1, T a2, T m2) { T s, t, d; if(m2 > m1) swap(a1, a2), swap(m1, m2); if(m1 > M){ if(a1 % m2 == a2) return {a1, m1}; return {-1,-1}; } extended_euclid(m1, m2, s, t, d); if (a1 % d != a2 % d) return {0, -1}; auto l = (m1/d > M/m2) ? M+1 : m1/d*m2; return {mod(s*a2 %m2 * (m1/d) + mulmod(t, a1, m1) * (m2/d), l), l}; } using P = vector; P operator*(const P& l, const P& r){ P p(l.size()); for(int i = 0; i < l.size(); ++i) p[i] = r[l[i]]; return p; } long long order(const P& p){ T o = 1; vector done(p.size(), false); for(int i = 0; i < p.size(); ++i){ if(done[i]) continue; int l = 0; while(!done[i]) done[i] = true, i = p[i], ++l; o = lcm(o, l); cerr << o << endl; if(o > M) return M+1; } return o; } void print(long long n){ if(n > M) cout << "huge\n"; else cout << n << endl; } int main(){ int n; cin >> n; P a(n), b(n); for(auto &x : a) cin >> x, --x; for(auto &x : b) cin >> x, --x; auto ab = a*b; // Solve for even number of turns. auto even = 2*order(ab); // Solve for odd number of turns: // The cycle structure of A*B must become equal to that of A^-1 pair odd{0,1}; P ai(n); for(int i = 0; i < n; ++i) ai[a[i]] = i; vector done(n, false); for(int i = 0; i < n; ++i){ if(done[i]) continue; int target = ai[i]; int period = 0, offset = -1; do{ if(i==target) offset = period; done[i] = true; i = ab[i], ++period; } while(!done[i]); // Make sure that the rest of the cycle also maps correctly after // rotating. for(int k = 0; offset >= 0 and k < period; ++k){ if(ai[i] != target) offset = -1; i = ab[i]; target = ab[target]; } if(offset == -1){ print(even); return 0; } odd = crt(odd.first, odd.second, offset, period); cerr << odd.first << ' ' << odd.second << endl; if(odd.second == -1 or odd.first > M){ print(even); return 0; } } print(min(even, 2*(long long)odd.first+1)); }