use std::collections::*; use std::io::Write; type Map = BTreeMap; type Set = BTreeSet; type Deque = VecDeque; fn main() { input! { n: usize, k: i64, seed: i64, a: i64, b: i64, m: i64, } let mut f = vec![0; 2 * n]; f[0] = seed; for i in 1..f.len() { f[i] = (a * f[i - 1] + b) % m; } let mut item = vec![vec![]; 4]; for (a, b) in f.iter().zip(f[n..].iter()) { let w = (*a % 3 + 1) as usize; let v = *b * w as i64; item[w].push(v); } for p in item.iter_mut() { p.sort(); } let one = &item[1]; let two = &item[2]; let three = &item[3]; let mut ans = 0; for r in 0..3 { let mut one = one.clone(); let mut two = two.clone(); let mut geta = 0; for _ in 0..r { geta += two.pop().unwrap_or(0); geta += one.pop().unwrap_or(0); } let mut k = k - r; let mut one = one .rchunks(3) .map(|one| one.iter().sum::()) .rev() .collect::>(); let mut x = one.len(); let mut y = three.len(); while k > 0 && (x > 0 || y > 0) { if x > 0 && (y == 0 || one[x - 1] >= three[y - 1]) { k -= 1; x -= 1; geta += one[x]; } else { k -= 1; y -= 1; geta += three[y]; } } ans = ans.max(geta); let two = two .rchunks(3) .map(|two| two.iter().sum::()) .rev() .collect::>(); for t in two.iter().rev() { k -= 2; geta += *t; if x == one.len() { k -= 1; if x > 0 { x -= 1; geta += one[x]; } } one.pop(); while k < 0 && (x < one.len() || y < three.len()) { k += 1; if x < one.len() && (y == three.len() || one[x] <= three[y]) { geta -= one[x]; x += 1; } else { geta -= three[y]; y += 1; } } if k >= 0 { ans = ans.max(geta); } } } println!("{}", ans); } // ---------- begin input macro ---------- // reference: https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 #[macro_export] macro_rules! input { (source = $s:expr, $($r:tt)*) => { let mut iter = $s.split_whitespace(); input_inner!{iter, $($r)*} }; ($($r:tt)*) => { let s = { use std::io::Read; let mut s = String::new(); std::io::stdin().read_to_string(&mut s).unwrap(); s }; let mut iter = s.split_whitespace(); input_inner!{iter, $($r)*} }; } #[macro_export] macro_rules! input_inner { ($iter:expr) => {}; ($iter:expr, ) => {}; ($iter:expr, $var:ident : $t:tt $($r:tt)*) => { let $var = read_value!($iter, $t); input_inner!{$iter $($r)*} }; } #[macro_export] macro_rules! read_value { ($iter:expr, ( $($t:tt),* )) => { ( $(read_value!($iter, $t)),* ) }; ($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| read_value!($iter, $t)).collect::>() }; ($iter:expr, chars) => { read_value!($iter, String).chars().collect::>() }; ($iter:expr, bytes) => { read_value!($iter, String).bytes().collect::>() }; ($iter:expr, usize1) => { read_value!($iter, usize) - 1 }; ($iter:expr, $t:ty) => { $iter.next().unwrap().parse::<$t>().expect("Parse error") }; } // ---------- end input macro ----------