#include using namespace std; #define GET_MACRO(a, b, c, NAME, ...) NAME #define rep(...) GET_MACRO(__VA_ARGS__, rep3, rep2)(__VA_ARGS__) #define rep2(i, a) rep3 (i, 0, a) #define rep3(i, a, b) for (int i = (a); i < (b); i++) #define repr(...) GET_MACRO(__VA_ARGS__, repr3, repr2)(__VA_ARGS__) #define repr2(i, a) repr3 (i, 0, a) #define repr3(i, a, b) for (int i = (b) - 1; i >= (a); i--) template inline bool chmin(T1 &a, T2 b) { return b < a && (a = b, true); } template inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); } using ll = long long; pair extgcd(ll a, ll b) { if (b == 0) return {1, 0}; ll x, y; tie(x, y) = extgcd(b, a % b); return {y, x - a / b * y}; } ll modulo(ll a, ll mod) { a %= mod; a += mod; a %= mod; return a; } ll modinv(ll a, ll mod) { if (a == 0) return -1; if (__gcd(a, mod) != 1) return -1; return modulo(extgcd(a, mod).first, mod); } int main() { int n; cin >> n; vector p(n); rep (i, n) scanf("%d", &p[i]), p[i]--; vector> orb(n); vector vis(n); rep (i, n) if (!vis[i]) { int curr = i; while (!vis[curr]) { vis[curr] = true; orb[i].push_back(curr); curr = p[curr]; } } vector ans(n); map>> mp; rep (i, n) if (!orb[i].empty()) { mp[orb[i].size()].push_back(orb[i]); } for (auto p : mp) { int m = p.first; auto v = p.second; if (m % 2 == 0) { if (v.size() % 2 == 1) { cout << "No" << endl; return 0; } for (int i = 0; i < v.size(); i += 2) { auto v1 = v[i]; auto v2 = v[i + 1]; rep (j, m) { ans[v1[j]] = v2[j]; ans[v2[j]] = v1[(j + 1) % m]; } } } else { int inv = modinv(2, m); for (auto u : v) { rep (j, m) { ans[u[j]] = u[(j + inv) % m]; } } } } cout << "Yes" << endl; // rep (i, n) printf("%d ", ans[i] + 1); // cout << endl; return 0; }