abc367_e
Permute K times の解説
ダブリング by @ohnuma
解説
dp[i][j]:=頂点jから1<<iだけ移動した先の頂点として、ダブリングするだけ。本当にするだけ。
fn main() { input! { n: usize, k: usize, x: [Usize1; n], a: [usize; n] } let count = 61; let mut dp = vec![vec![0; n]; count]; for i in 0..n { dp[0][i] = x[i]; } for i in 0..count - 1 { for j in 0..n { dp[i + 1][j] = dp[i][dp[i][j]]; } } let mut ans = vec![]; for i in 0..n { let mut now = i; for j in 0..count { let flg = (k >> j) & 1 == 1; if !flg { continue; } now = dp[j][now]; } ans.push(now); } let ans = ans.iter().map(|&e| a[e]).join(" "); println!("{}", ans); }