提交时间:2024-10-24 14:01:10

运行 ID: 33856

#include <algorithm> #include <cmath> #include <cstdio> #include <vector> using namespace std; using i128 = __int128_t; void write(i128 val) { if (val == 0) { puts("0"); return; } vector<int> digits; while (val > 0) { digits.emplace_back(val % 10); val /= 10; } reverse(digits.begin(), digits.end()); for (int x : digits) printf("%d", x); putchar('\n'); } i128 income(const vector<int>& cnts, int n, int b, int k, int x) { i128 res = (i128)(1 - k) * x; // fprintf(stderr, "[%d] (%lld) ", k, res); for (int cnt : cnts) { if (cnt <= k) { res += (i128)(cnt - 1) * b * cnt / 2; // fprintf(stderr, "%lld ", b * cnt * (i128)(cnt - 1) / 2); continue; } i128 div_k = cnt / k, mod_k = cnt % k; if (mod_k == 0) { res += div_k * b * 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 t; int solve_test() { // 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); } int l = 1, r = mx_cnt; while (l < r) { int mid = (l + r) >> 1; i128 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; } write(income(cnts, n, b, l, x)); // system("grep VmPeak /proc/$PPID/status >&2"); // fclose(stdin); // fclose(stdout); return 0; } int main() { t = 1; while (t-- > 0) solve_test(); return 0; } // #include <algorithm> // #include <cstdio> // #include <ranges> // #include <vector> // using namespace std; // using i128 = __int128_t; // void write(i128 val) // { // if (val == 0) { // puts("0"); // return; // } // vector<int> digits; // while (val > 0) { // digits.emplace_back(val % 10); // val /= 10; // } // for (int x : digits | views::reverse) // printf("%d", x); // putchar('\n'); // } // constexpr i128 INF = ((i128)0x3f3f3f3f3f3f3f3f << 64) | 0x3f3f3f3f3f3f3f3f; // i128 income(const vector<int>& cnts, int n, int b, int k, int x) // { // i128 res = (i128)(1 - k) * x; // // fprintf(stderr, "[%d] (%lld) ", k, res); // for (int cnt : cnts) { // if (cnt <= k) { // res += (i128)(cnt - 1) * b * cnt / 2; // // fprintf(stderr, "%lld ", b * cnt * (i128)(cnt - 1) / 2); // continue; // } // i128 div_k = cnt / k, mod_k = cnt % k; // if (mod_k == 0) { // res += div_k * b * 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 solve_test() // { // 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); // } // i128 mx = -INF; // for (int i = 1; i <= mx_cnt; ++i) // mx = max(mx, income(cnts, n, b, i, x)); // write(mx); // return 0; // } // int main() // { // int t; // scanf("%d", &t); // while (t-- > 0) // solve_test(); // return 0; // }