結果

問題 No.3529 2p Teleportations
コンテスト
ユーザー lif4635
提出日時 2026-05-04 22:49:33
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
RE  
実行時間 -
コード長 4,981 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 188 ms
コンパイル使用メモリ 85,220 KB
実行使用メモリ 106,136 KB
最終ジャッジ日時 2026-05-04 22:49:50
合計ジャッジ時間 12,376 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 1
other AC * 2 RE * 47
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

# input
import sys
input = sys.stdin.readline
II = lambda : int(input())
MI = lambda : map(int, input().split())
LI = lambda : [int(a) for a in input().split()]
SI = lambda : input().rstrip()
LLI = lambda n : [[int(a) for a in input().split()] for _ in range(n)]
LSI = lambda n : [input().rstrip() for _ in range(n)]
MI_1 = lambda : map(lambda x:int(x)-1, input().split())
LI_1 = lambda : [int(a)-1 for a in input().split()]

mod = 998244353
inf = 1001001001001001001
ordalp = lambda s : ord(s)-65 if s.isupper() else ord(s)-97
ordallalp = lambda s : ord(s)-39 if s.isupper() else ord(s)-97
yes = lambda : print("Yes")
no = lambda : print("No")
yn = lambda flag : print("Yes" if flag else "No")

prinf = lambda ans : print(ans if ans < 1000001001001001001 else -1)
alplow = "abcdefghijklmnopqrstuvwxyz"
alpup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alpall = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
URDL = {'U':(-1,0), 'R':(0,1), 'D':(1,0), 'L':(0,-1)}
DIR_4 = [[-1,0],[0,1],[1,0],[0,-1]]
DIR_8 = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]
DIR_BISHOP = [[-1,1],[1,1],[1,-1],[-1,-1]]
prime60 = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59]
sys.set_int_max_str_digits(0)
# sys.setrecursionlimit(10**6)
# import pypyjit
# pypyjit.set_param('max_unroll_recursion=-1')

from collections import defaultdict,deque
from heapq import heappop,heappush
from bisect import bisect_left,bisect_right
DD = defaultdict
BSL = bisect_left
BSR = bisect_right

class DSU:
    n : int 
    par : list[int]
    siz : list[int]
    fix_leader : bool
    __slots__ = ["n", "par", "siz", "fix_leader"]
    
    def __init__(self, n, fix_leader = False):
        self.n = n
        self.par = [*range(n)]
        self.siz = [1] * n
        self.fix_leader = fix_leader

    def leader(self, a):
        while self.par[a] != a:
            a = self.par[self.par[a]]
            self.par[a] = self.par[self.par[a]]
        return a

    def merge(self, a, b):
        a = self.leader(a)
        b = self.leader(b)
        if a == b: return a
        if self.fix_leader or self.siz[a] > self.siz[b]:
            self.siz[a] += self.siz[b]
            self.par[b] = a
            return a
        else:
            self.siz[b] += self.siz[a]
            self.par[a] = b
            return b

    def same(self, a, b):
        return self.leader(a) == self.leader(b)
    
    def size(self, a):
        return self.siz[self.leader(a)]
    
    def groups(self):
        res = [[] for i in range(self.n)]
        for i in range(self.n):
            res[self.leader(i)].append(i)
        res2 = []
        for i in range(self.n):
            if len(res[i]) > 0:
                res2.append(res[i])
        return res2

"""
生徒 i を i におくりたい
サイクルに分解する

p は素数
c : odd のときは (2p, c) がごそなので ok
c : even のときは c, c で merge
or 
あまりは sqrt(n) 以下 これは 1 人殺す

(k + 1) * k <= n
sqrt(n) ? 


sqrt(n) + 1 になりそうなんだが?
"""

def solve():
    n, p = MI()
    a = LI_1()
    uf = DSU(n)
    
    for i in range(n):
        uf.merge(i, a[i])
    
    ok = [[] for i in range(n + 1)]
    for g in uf.groups():
        s = []
        x = g[0]
        for i in range(len(g)):
            s.append(x)
            x = a[x]
        ok[len(g)].append(s[::-1])
    
    # print(ok)
    
    tmp2 = []
    ans = [0] * n
    for l in range(1, n + 1):
        if l % 2 == 1:
            c = (2 * p) % l # c 個先が l
            for g in ok[l]:
                tmp = [0] * l
                idx = 0
                for x in g:
                    tmp[idx] = x
                    idx = (idx + c) % l
                # print(tmp, g)
                for i in range(l):
                    ans[tmp[i]] = tmp[(i+1)%l]
        else:
            c = (2 * p) % (2 * l)
            while len(ok[l]) >= 2:
                g1 = ok[l].pop()
                g2 = ok[l].pop()
                
                tmp = [0] * (2 * l)
                idx = 0
                for x in g1:
                    tmp[idx] = x
                    idx = (idx + c) % (2 * l)
                idx = 1
                for x in g2:
                    tmp[idx] = x
                    idx = (idx + c) % (2 * l)
                for i in range(2 * l):
                    ans[tmp[i]] = tmp[(i+1)%(2*l)]
            
            # のこっているとき
            # 順列じゃなくていいの忘れていた
            if ok[l]:
                c = (2 * p) % (l - 1)
                tmp = [0] * (l - 1)
                idx = 0
                g = ok[l][0]
                for x in g[:-1]:
                    tmp[idx] = x
                    idx = (idx + c) % (l - 1)
                for i in range(2*l-1):
                    ans[tmp[i]] = tmp[(i+1)%(l-1)]
                idx = (idx - c + 1) % (l - 1)
                ans[g[-1]] = tmp[idx]
    
    ans = [x+1 for x in ans]
    print(*ans)


t = II()
for i in range(t):
    solve()


0