結果

問題 No.3529 2p Teleportations
コンテスト
ユーザー The Forsaking
提出日時 2026-05-07 02:13:14
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 3,103 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,562 ms
コンパイル使用メモリ 222,800 KB
実行使用メモリ 6,400 KB
最終ジャッジ日時 2026-05-07 02:13:33
合計ジャッジ時間 15,194 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 2 WA * 47
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>

using namespace std;

using pii = pair<int, int>;
using ll = long long;
const int N = 2000010, MOD = 998244353, INF = 0x3f3f3f3f;
int n, m, w[N];

int a[N];
void solve() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i < n + 1; i++) scanf("%d", w + i), a[w[i]] = i;
    vector<bool> st(n + 1);
    vector<int> stk, ans(n + 1);
    vector<vector<vector<int> > > p(n + 1);
    for (int i = 1; i < n + 1; i++) 
        if (!st[i]) {
            stk.push_back(i);
            st[i] = 1;
            int ne = i;
            while (!st[a[ne]]) ne = a[ne], st[ne] = 1, stk.push_back(ne);
            if (stk.size() == 1) ans[stk.back()] = i;
            else {
                int len = stk.size(), t = m * 2 % len;
                if (__gcd(t, len) == 1) {
                    vector<int> q(stk.size());
                    int now = 0;
                    for (int i = 0; i < len; i++) {
                        q[now] = stk[i];
                        now = (now + t) % len;
                    }
                    for (int i = 0; i < len; i++) {
                        ans[q[i]] = q[(i + 1) % len];
                    }
                } else {
                    p[len].push_back(stk);
                }
            }
            stk.clear();
        }
    for (int i = 2; i <= n; i += 2) {
        while (p[i].size() > 1) {
            auto a = p[i].back(); p[i].pop_back();
            auto b = p[i].back(); p[i].pop_back();
            vector<int> q(i << 1);
            int now = 0, t = m * 2 % (i << 1);
            for (int j = 0; j < i; j++) {
                q[now] = a[j];
                now = (now + t) % i;
            }
            now = 1;
            for (int j = 0; j < i; j++) {
                q[now] = b[j];
                now = (now + t) % i;
            }
            for (int j = 0; j < (i << 1); j++) ans[q[j]] = q[(j + 1) % (i << 1)];
        }
        if (p[i].size()) {
            auto u = p[i].back();
            int x = u.back(); u.pop_back();
            int len = u.size(), t = m * 2 % len;
            vector<int> q(u.size());
            int now = 0;
            for (int i = 0; i < len; i++) {
                q[now] = u[i];
                now = (now + t) % len;
            }
            for (int i = 0; i < len; i++) {
                ans[q[i]] = q[(i + 1) % len];
            }
            ans[x] = q[0];
        }
    }
    for (int i = 1; i < n + 1; i++) printf("%d ", ans[i]);
    puts("");
    return;

    vector<vector<int> > f(n + 1), g(n + 1);
    for (int i = 1; i < n + 1; i++) f[i].push_back(a[i]);
    for (int i = 1; i < m * 2 + 1; i++) {
        for (int j = 1; j < n + 1; j++) g[j].clear();
        for (int j = 1; j < n + 1; j++)
            for (auto t : f[j])
                g[ans[j]].push_back(t);
        swap(g, f);
    }
    int sum = n;
    for (int i = 1; i < n + 1; i++)
        for (auto u : f[i]) {
            sum -= u == i;
        }
    // printf("%d %d\n", sum, (int)sqrt(n));
    // assert(sum <= sqrt(n));
}

int main() {
    int T = 1;
    scanf("%d", &T);
    while (T--) solve();
    return 0;
}
0