提交时间:2024-10-24 13:32:10

运行 ID: 33843

#include <algorithm> #include <cmath> #include <cstdio> #include <random> #include <vector> using namespace std; using i64 = long long; minstd_rand rng(random_device {}()); inline int gen(int l, int r) { return l + rng() % (r - l + 1); } i64 income(const vector<int>& cnts, int n, int b, int k, int x) { i64 res = (i64)(1 - k) * x; // fprintf(stderr, "[%d] (%lld) ", k, res); for (int cnt : cnts) { if (cnt <= k) { res += b * cnt * (i64)(cnt - 1) / 2; // fprintf(stderr, "%lld ", b * cnt * (i64)(cnt - 1) / 2); continue; } i64 div_k = cnt / k, mod_k = cnt % k; if (mod_k == 0) { res += b * k * div_k * (cnt - div_k) / 2; // fprintf(stderr, "%lld ", b * k * div_k * (cnt - div_k) / 2); } else { res += b * ((k * div_k * (k - 1) * div_k + mod_k * (mod_k - 1)) / 2 + mod_k * (k - 1) * div_k); // fprintf(stderr, "%lld ", b * (((k - 1) * div_k * (k - 2) * div_k + mod_k * (mod_k - 1)) / 2 + mod_k * (k - 1) * div_k)); } } // fputc('\n', stderr); return res; } int main() { // freopen("army.in", "r", stdin); // freopen("army.out", "w", stdout); int n, b, x; scanf("%d %d %d", &n, &b, &x); int mx_cnt = 0; vector<int> cnts(n); for (int& cnt : cnts) { scanf("%d", &cnt); mx_cnt = max(mx_cnt, cnt); } i64 mx = 0; int times = 1e8 / n / log2(mx_cnt); for (int i = 0; i < times; ++i) { int l = 1, r = mx_cnt; while (l < r) { int mid = gen(l, r - 1); i64 val = income(cnts, n, b, mid, x), nxt = income(cnts, n, b, mid + 1, x); // fprintf(stderr, "%lld %lld\n", val, nxt); if (val < nxt) l = mid + 1; else r = mid; } mx = max(mx, income(cnts, n, b, l, x)); } printf("%lld\n", mx); // system("grep VmPeak /proc/$PPID/status >&2"); // fclose(stdin); // fclose(stdout); return 0; }