#include namespace { #pragma GCC diagnostic ignored "-Wunused-function" #include #pragma GCC diagnostic warning "-Wunused-function" using namespace std; using namespace atcoder; #define rep(i,n) for(int i = 0; i < (int)(n); i++) #define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--) #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) template bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; } template bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; } using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; // https://ei1333.github.io/library/structure/others/priority-sum-structure.hpp template< typename T, typename Compare = less< T >, typename RCompare = greater< T > > struct PrioritySumStructure { size_t k; T sum; priority_queue< T, vector< T >, Compare > in, d_in; priority_queue< T, vector< T >, RCompare > out, d_out; PrioritySumStructure(int k) : k(k), sum(0) {} void modify() { while(in.size() - d_in.size() < k && !out.empty()) { auto p = out.top(); out.pop(); if(!d_out.empty() && p == d_out.top()) { d_out.pop(); } else { sum += p; in.emplace(p); } } while(in.size() - d_in.size() > k) { auto p = in.top(); in.pop(); if(!d_in.empty() && p == d_in.top()) { d_in.pop(); } else { sum -= p; out.emplace(p); } } while(!d_in.empty() && in.top() == d_in.top()) { in.pop(); d_in.pop(); } } T query() const { return sum; } void insert(T x) { in.emplace(x); sum += x; modify(); } void erase(T x) { assert(size()); if(!in.empty() && in.top() == x) { sum -= x; in.pop(); } else if(!in.empty() && RCompare()(in.top(), x)) { sum -= x; d_in.emplace(x); } else { d_out.emplace(x); } modify(); } void set_k(size_t kk) { k = kk; modify(); } size_t get_k() const { return k; } size_t size() const { return in.size() + out.size() - d_in.size() - d_out.size(); } }; template< typename T > using MaximumSum = PrioritySumStructure< T, greater< T >, less< T > >; template< typename T > using MinimumSum = PrioritySumStructure< T, less< T >, greater< T > >; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, k, seed, a, b, m; cin >> n >> k >> seed >> a >> b >> m; VI f(2 * n); rep(i, 2 * n) { f[i] = seed; seed = ((ll)a * seed + b) % m; } VI v1, v2, v3; rep(i, n) { int wi = f[i] % 3; int vi = f[n + i]; (wi == 0 ? v1 : wi == 1 ? v2 : v3).emplace_back(vi); } sort(rall(v1)); sort(rall(v2)); sort(rall(v3)); ll ans = 0; rep(r, 3) { int now = min(k, (int)v2.size()); if (now < r) continue; while (now % 3 != r) now--; ll sm2 = 0; rep(i, now) { if (i < ssize(v1)) sm2 += v1[i] + 2LL * v2[i]; else sm2 += 2LL * v2[i]; } MaximumSum q(k - now); for (auto x : v3) q.insert(3LL * x); for (int i = now; i < ssize(v1); i += 3) { int j = min(i + 3, ssize(v1)); q.insert(accumulate(v1.begin() + i, v1.begin() + j, 0LL)); } chmax(ans, sm2 + q.query()); while (now != r) { now -= 3; for (int i = now; i < now + 3; i++) { if (i < ssize(v1)) sm2 -= v1[i] + 2LL * v2[i]; else sm2 -= 2LL * v2[i]; } if (now < ssize(v1)) { int j = min(now + 3, ssize(v1)); q.insert(accumulate(v1.begin() + now, v1.begin() + j, 0LL)); } q.set_k(k - now); chmax(ans, sm2 + q.query()); } } cout << ans << '\n'; }