for (int i = 1, G = 0; i <= n; ++i) { int now = i; if (!vis[i]) { int c = 0; ring[++G] = i; // 环 G 的起点 i while (!vis[now]) { vis[now] = 1; ve[now] = G; id[now] = c++; now = a[now]; } len[G] = c; } }
bool ok = true; for (int i = 1; i <= n; ++i) { if (ve[a[i]] != ve[b[i]]) { ok = false; break; } } if (!ok) { puts("No"); continue; }
std::vector<int> md(n + 1, -1); for (int i = 1; i <= n; ++i) { int L = len[ve[b[i]]]; int d = (id[b[i]] + L - id[a[i]]) % L; if (md[L] != -1) ok &= (md[L] == d); else md[L] = d; }
if (!ok) { puts("No"); continue; }
vector<int> vec; for (int i = 1; i <= n; ++i) if (md[i] != -1) vec.push_back(i);
auto check = [&](int x, int y, int z, int w) -> bool { int _gcd = gcd(x, z); if (y % _gcd != w % _gcd) returnfalse; returntrue; };
for (int i : vec) for (int j : vec) // 枚举所有环的长度,和该长度的环转的次数 ok &= check(i, md[i], j, md[j]);