module Main; import BinaryHeap; import BoolArray; import CPLib.Arithmetic; import CPLib.Bipartite; import CPLib.Bits; import CPLib.Convolution; import CPLib.DSegtree; import CPLib.Graph; import CPLib.IO; import CPLib.LDSegtree; import CPLib.LSegtree; import CPLib.MaxFlow; // import CPLib.Memoize; import CPLib.MinCostFlow; import CPLib.Misc; import CPLib.Monoid; import CPLib.Segtree; import CPLib.String; import CPLib.Trait; import CPLib.TwoSat; import CPLib.UnionFind; import CPLib.ZP; import HashMap; import HashSet; cM : I64 = 150000; cI : I64 = ( count_up(0).filter(|n| (1.shift_left(n)-1)*(1.shift_left(n)-2)/2 > cM*cM ).get_first.as_some ); decode : I64 -> I64 -> Array I64 = |flag, len| ( range(0, len).fold(([], flag), |_, (arr, flag)| let x = flag % 3; let r = if x == 0 { x } else if x == 1 { -1 } else { 1 }; let arr = arr.push_back(r); let flag = flag / 3; (arr, flag) ).@0 ); sums : Array I64 -> HashMap I64 I64 = |as| ( let len = as.@size; let pow3 = range(0, len).fold(1, |_, pow| pow * 3); let table = HashMap::empty(pow3); let table = range(0, pow3).fold(table, |flag, table| let bs = decode(flag, len); let sum = range(0, len).map(|i| as.@(i) * bs.@(i)).sum; table.HashMap::insert(sum, flag) ); table ); show_hashmap : HashMap I64 I64 -> String = |mp| ( mp.to_iter.to_array.to_string ); main : IO () = ( let iN = *read_i; let iAs = *read_is(iN); let cL = min(cI, iN); let as0 = iAs.get_sub(0, cL/2); let as1 = iAs.get_sub(cL/2, cL); let sums0 = sums(as0); let sums1 = sums(as1); // eval "sums0 = {}".debug_eprintfln((sums0.show_hashmap,)); // eval "sums1 = {}".debug_eprintfln((sums1.show_hashmap,)); let opt_pair = sums0.to_iter.filter_map(|(sum0, flag0)| match sums1.HashMap::find(sum0) { none() => none(), some(flag1) => ( if flag0 == 0 && flag1 == 0 { none() }; (flag0, flag1).some ) } ).get_first; match opt_pair { none() => ( println("No") ), some((flag0, flag1)) => ( let bs0 = decode(flag0, as0.@size); let bs1 = decode(flag1, as1.@size); let ans = []; let ans = range(0, as0.@size).fold(ans, |i, ans| let b = as0.@(i) * bs0.@(i); ans.push_back(b) ); let ans = range(0, as1.@size).fold(ans, |i, ans| let b = as1.@(i) * bs1.@(i); ans.push_back(-b) ); let ans = range(ans.@size, iN).fold(ans, |i, ans| ans.push_back(0)); "Yes".println;; "{}".printfln((ans.to_iter.joined_with(" "),)) ) };; pure() );