結果
| 問題 |
No.1013 〇マス進む
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-05-16 14:16:39 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 115 ms / 2,000 ms |
| コード長 | 1,403 bytes |
| コンパイル時間 | 12,654 ms |
| コンパイル使用メモリ | 220,052 KB |
| 実行使用メモリ | 7,792 KB |
| 最終ジャッジ日時 | 2024-09-22 08:05:28 |
| 合計ジャッジ時間 | 18,653 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 62 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
)
// {1, 2, ..., N} を並び替えた順列 P が与えられます。
// P を 10^10 個つなげた数列をTとします。
// あなたは T 上で以下の行動を行います。
// * i 番目の要素に居るとき、 i + T_i 番目 の要素に移動する
// 最初に i 番目(i=1,2,...,N)の要素にいるとき、このような行動をK回行ったのち
// 何番目の要素にたどり着くかを、全ての i に対してそれぞれ求めて1行ずつ出力してください。
func Solve(n int, k int, p []int) []int {
r := make([]int, n)
for i, _ := range r {
r[i] = i
}
nt := make([]int, n)
for i, x := range p {
nt[i] = x
}
ct := make([]int, n)
// doubling
for k != 0 {
// swap buffer
nt, ct = ct, nt
// doubling
for i, x := range ct {
nt[i] = x + ct[(i+x)%n]
}
// check should adding current?
bit := k & 1
k >>= 1
if bit == 0 {
continue
}
// adding current movement
for i, x := range r {
r[i] = x + ct[x%n]
}
}
for i, x := range r {
r[i] = x + 1
}
return r
}
func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
n, k := 0, 0
fmt.Fscan(r, &n)
fmt.Fscan(r, &k)
p := make([]int, n)
for i, _ := range p {
fmt.Fscan(r, &p[i])
}
result := Solve(n, k, p)
for _, x := range result {
fmt.Fprintf(w, "%d\n", x)
}
}