fn main() { input!{ mut x: i128, n: i128, } let mut f = false; if x < 0 { x *= -1; f = true; } // n項目が正のまま let acc_val = calc_acc_val(n); if x - acc_val >= 0 { println!("{}", ans_val(x, acc_val, f)); return; } // 正、負が変わる場合は、その地点を見つける let mut left = -1i128; let mut right = 1i128 << 60; for _ in 0..70 { let mid = (left + right) / 2; if x - calc_acc_val(mid) > 0 { left = mid; } else { right = mid; } } // 初めて0以下になった地点からの項数 let rest_cnt = n - right; if rest_cnt % 2 == 0 { let add_cnt = rest_cnt / 2; println!("{}", ans_val(x - add_cnt, calc_acc_val(right), f)) } else { let add_cnt = (rest_cnt+1) / 2; println!("{}", ans_val(x + add_cnt, calc_acc_val(left), f)) } } fn calc_acc_val(x: i128) -> i128 { x * (1+x) / 2 } fn ans_val(x: i128, acc_x: i128, f: bool) -> i128 { let mut ret = x - acc_x; if f { ret *= -1; } ret } // const MOD17: usize = 1000000007; // const MOD93: usize = 998244353; // const INF: usize = 1 << 60; // let dx = vec![!0, 0, 1, 0]; // 上左下右 // let dy = vec![0, !0, 0, 1]; // 上左下右 // let d = vec!{(!0, 0), (0, !0), (1, 0), (0, 1)}; // 上左下右 #[allow(unused)] use proconio::{input, marker::Chars, marker::Usize1}; #[allow(unused)] use std::{ mem::swap, cmp::min, cmp::max, cmp::Reverse, collections::HashSet, collections::BTreeSet, collections::HashMap, collections::BTreeMap, collections::BinaryHeap, collections::VecDeque, iter::FromIterator, };