結果
| 問題 | No.1013 〇マス進む |
| コンテスト | |
| ユーザー |
urectanc
|
| 提出日時 | 2026-05-04 17:21:02 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 23 ms / 2,000 ms |
| コード長 | 2,225 bytes |
| 記録 | |
| コンパイル時間 | 1,125 ms |
| コンパイル使用メモリ | 193,920 KB |
| 実行使用メモリ | 6,784 KB |
| 最終ジャッジ日時 | 2026-05-04 17:21:09 |
| 合計ジャッジ時間 | 4,783 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 62 |
ソースコード
use itertools::Itertools;
use proconio::input;
fn main() {
input! {
n: usize, mut k: usize,
p: [usize; n],
}
let ans = solve(k, &p);
println!("{}", ans.iter().join("\n"));
}
fn solve(mut k: usize, p: &[usize]) -> Vec<usize> {
let n = p.len();
let mut pos = (0..n).collect_vec();
let mut ans = (1..=n).collect_vec();
let mut dp = p.to_owned();
while k > 0 {
if k & 1 == 1 {
for i in 0..n {
ans[i] += dp[pos[i]];
}
for i in 0..n {
pos[i] = (pos[i] + dp[pos[i]]) % n;
}
}
dp = (0..n).map(|i| dp[i] + dp[(i + dp[i]) % n]).collect();
debug!(pos, ans, dp);
k >>= 1;
}
ans
}
#[macro_export]
macro_rules! debug {
($($a:expr),* $(,)?) => {
#[cfg(debug_assertions)]
{
eprint!("{}:{}: ", file!(), line!());
eprintln!(concat!($(stringify!($a), " = \x1b[31m{:?}\x1b[m, "),*), $(&$a),*);
}
};
}
#[cfg(test)]
mod tests {
use rand::{RngExt, seq::SliceRandom};
use super::*;
fn testcase(rng: &mut impl rand::Rng) -> (usize, Vec<usize>) {
let n = rng.random_range(2..10);
let k = rng.random_range(2..10);
let mut p = (1..=n).collect_vec();
p.shuffle(rng);
(k, p)
}
fn naive(k: usize, p: &[usize]) -> Vec<usize> {
let n = p.len();
let t = p.iter().copied().cycle().take(100000).collect_vec();
(0..n)
.map(|mut i| {
for _ in 0..k {
i += t[i];
}
i + 1
})
.collect()
}
#[test]
fn stress() {
const T: usize = 1000;
let failed = vec![(7, vec![2, 1])];
for (k, p) in failed {
let actual = solve(k, &p);
let expected = naive(k, &p);
assert_eq!(expected, actual, "{k} {p:?}");
}
let mut rng = rand::rng();
for _ in 0..T {
let (k, p) = testcase(&mut rng);
let actual = solve(k, &p);
let expected = naive(k, &p);
assert_eq!(expected, actual, "{k} {p:?}");
}
}
}
urectanc