use library::utils::input::Input; fn solve(ip: &mut Input) { let n = ip.next(); if n % 2 == 0 { println!("No"); return; } let base = (n+3)/2; let target = (base..base+n).collect::>(); let mut p = vec![0; n]; let mut cur = 0; for i in 1..=n { p[cur] = i; cur += 2; cur %= n; } let mut q = vec![0; n]; for (i, pi) in p.iter().enumerate() { q[i] = target[i] - *pi; } println!("Yes"); println!("{}", p.iter().map(|x|x.to_string()).collect::>().join(" ")); println!("{}", q.iter().map(|x|x.to_string()).collect::>().join(" ")); } fn main() { static IS_MULTI_TEST_CASE :bool = false; let mut ip = Input::new(); let t = if IS_MULTI_TEST_CASE { ip.next::() } else { 1 }; for _ in 0..t { solve(&mut ip); } } // ===== bundled library ===== pub mod library { pub mod utils { pub mod input { use std::str::{from_utf8, FromStr}; pub struct Input { buf: Vec, pos: usize, } impl Default for Input { fn default() -> Self { Self::new() } } impl Input { pub fn new() -> Self { Self { buf: Vec::new(), pos: 0 } } pub fn next(&mut self) -> T { while self.pos < self.buf.len() && self.buf[self.pos].is_ascii_whitespace() { self.pos += 1; } let start = self.pos; while self.pos < self.buf.len() && !self.buf[self.pos].is_ascii_whitespace() { self.pos += 1; } if start == self.pos { let mut input = String::new(); std::io::stdin() .read_line(&mut input) .expect("Failed to read line"); self.buf.clear(); self.buf.extend(input.as_bytes()); self.pos = 0; return self.next(); } from_utf8(&self.buf[start..self.pos]) .unwrap() .parse::() .ok() .unwrap_or_else(|| { panic!( "Failed to parse input: {}", from_utf8(& self.buf[start ..self.pos]).unwrap() ) }) } #[allow(non_snake_case)] pub fn vector(&mut self, n: usize) -> Vec { (0..n).map(|_| self.next()).collect() } pub fn graph( &mut self, n: usize, m: usize, is_one_way: bool, ) -> Vec> { let mut graph = vec![Vec::new(); n]; for _ in 0..m { let (u, v): (usize, usize) = self.pair(); graph[u - 1].push(v - 1); if !is_one_way { graph[v - 1].push(u - 1); } } graph } pub fn weighted_graph( &mut self, n: usize, m: usize, is_one_way: bool, is_one_based: bool, ) -> Vec> { let mut graph = vec![Vec::new(); n]; for _ in 0..m { let (u, v) = self.pair::(); let w = self.next::(); let u = if is_one_based { u - 1 } else { u }; let v = if is_one_based { v - 1 } else { v }; graph[u].push((v, w)); if !is_one_way { graph[v].push((u, w)); } } graph } pub fn pair(&mut self) -> (T, T) { (self.next(), self.next()) } pub fn triple(&mut self) -> (T, T, T) { (self.next(), self.next(), self.next()) } pub fn chars(&mut self) -> Vec { self.next::().chars().collect::>() } } } } }