xxxxxxxxxx
def solve():
n, k = map(int, input().split())
# 0-indexedで計算
a = list(map(lambda x: int(x) - 1, input().split()))
b = list(map(lambda x: int(x) - 1, input().split()))
c = list(map(lambda x: int(x) - 1, input().split()))
originalK = k
# 現在位置(まずは0,1,2,3...)
cur = list(range(n))
#ベースとなる3回移動(Aをつかい次にAのポータルを使う移動の最小単位)を作る
portala = list(range(n))
for i in range(n):
portala[i] = a[portala[i]] # 1回
portala[i] = b[portala[i]] # 2回
portala[i] = c[portala[i]] # 3回
# STEP1:
# この方法では、テーブルを作りながら計算をしています
k = k - k % 3 # STEP1なので、最下位の桁は無視したい
cnt = 1 # 1の位は一度無視して計算する
while k > 0:
# この桁の3進数での数字
curnum = k % 3**(cnt+1) // 3**cnt
# この桁の数の回数移動をする
for loop in range(curnum):
for i in range(n):
cur[i] = portala[cur[i]]
# 次の桁のベースを作る。この桁のベースを2回遷移させる
newportal = [None] * n
for i in range(n):
newportal[i] = portala[portala[portala[i]]]
portala = newportal
# そして、桁の計算を終える
k -= (3**cnt) * curnum
cnt += 1
# STEP2の処理 1の桁をケアする
if originalK % 3 >= 1:
for i in range(n): cur[i] = a[cur[i]]
if originalK % 3 >= 2:
for i in range(n): cur[i] = b[cur[i]]
print(" ".join(list(map(lambda x:(str(x+1)), cur))))
solve()
提出日時 | |
ユーザー | ![]() |
言語 | Python3 (pypy3 7.3.1) |
結果 | AC |
実行時間 | 775 ms |
メモリ | 1528528 kb |
テストケース名 | 結果 | 実行時間 | メモリ |
---|---|---|---|
00_sample-1.txt | AC | 72 ms | 1528528 kb |
00_sample-4.txt | AC | 51 ms | 1528528 kb |
01_mid-1.txt | AC | 50 ms | 1528528 kb |
01_mid-2.txt | AC | 52 ms | 1528528 kb |
01_mid-3.txt | AC | 51 ms | 1528528 kb |
02_sample-2.txt | AC | 54 ms | 1528528 kb |
02_sample-3.txt | AC | 51 ms | 1528528 kb |
handmade-1.txt | AC | 320 ms | 1528528 kb |
large-1.txt | AC | 436 ms | 1528528 kb |
large-2.txt | AC | 423 ms | 1528528 kb |
large-3.txt | AC | 432 ms | 1528528 kb |
shuffle-1.txt | AC | 571 ms | 1528528 kb |
shuffle-2.txt | AC | 775 ms | 1528528 kb |