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 { 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) { 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 { 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:?}"); } } }