結果
問題 | No.3048 Swing |
ユーザー |
|
提出日時 | 2025-03-07 23:01:19 |
言語 | Rust (1.83.0 + proconio) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,554 bytes |
コンパイル時間 | 15,470 ms |
コンパイル使用メモリ | 402,344 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-14 17:02:41 |
合計ジャッジ時間 | 16,773 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 58 WA * 1 |
ソースコード
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, };