// #define _GLIBCXX_DEBUG #include using namespace std; #include using namespace atcoder; using ll = long long; #define rep(i,n) for (ll i = 0; i < (n); ++i) using vl = vector; using vvl = vector; using P = pair; #define pb push_back #define int long long #define double long double #define INF (ll) 3e18 // Ctrl + Shift + B コンパイル // Ctrl + C 中断 // ./m 実行 // 転倒数ライブラリ // from ARC 120 // vl a とvl b を渡すことで // vl a をvl b にするために必要なswap回数を出力する // 不可能な場合は その旨を文章に出力する // 不可能事の出力が必要な場合は // 文章の位置を return -1にすることで // 不可能判定が可能 template class fenwick { public: vector fenw; int n; fenwick(int _n) : n(_n) { fenw.resize(n); } void modify(int x, T v) { while (x < n) { fenw[x] += v; x |= (x + 1); } } T get(int x) { T v{}; while (x >= 0) { v += fenw[x]; x = (x & (x + 1)) - 1; } return v; } }; ll tentou(vl x, vl y) { ll n = x.size(); vector> a(n), b(n); for (ll i = 0; i < n; i++) { a[i].first = x[i]; a[i].second = i; } for (ll i = 0; i < n; i++) { b[i].first = y[i]; b[i].second = i; } sort(a.begin(), a.end()); sort(b.begin(), b.end()); vector p(n); for (ll i = 0; i < n; i++) { if (a[i].first != b[i].first) { cout << -1 << '\n'; cout << "swapにより配列 a b を等しくすることは不可能です" << endl; return 0; } p[a[i].second] = b[i].second; } fenwick fenw(n); ll ans = 0; for (ll i = n - 1; i >= 0; i--) { ans += fenw.get(p[i]); fenw.modify(p[i], 1); } return ans; } signed main(){ int n; cin >> n; int m; cin >> m; vl a(n); vl b(n); rep(i,n) cin >> a[i]; rep(i,n) b[i] = i+1; int tent = tentou(a, b); int k1 = tent / m * m; if (k1 < tent) k1 += m; int k2 = k1 + m; if (k1 % 2 == tent % 2) {cout << k1 << endl; return 0;} if (k2 % 2 == tent % 2) {cout << k2 << endl; return 0;} cout << -1 << endl; }