atcoder-solutionsatcoder-solutions
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); }

コメント