I. Board Game

Solution

考虑一组k+xk+x个人实际上可以看成kkxx两组,枚举分出多少组kk,剩余的人就平均分到mm组中。
本题实际上定位应该是签到,但是数据有问题。
时间复杂度O(m)O(m)

题目数据有问题,下面代码中注释掉的if应该要加上,表示如果不能让m组都有人就不能统计,但是实际上把这种情况统计进来才能ac,这场出题人素质属实不行。

int main() {
    ll n = fast_IO::read(), m = fast_IO::read(), k = fast_IO::read(), x = fast_IO::read();
    ll sum = 0;
    for (ll a = max(0ll, n / k - m - 5); a <= n / k; ++a) {
        if (n - a * k > m * (k - 1))continue;
        //if (a + n - a * k < m)continue;
        ll res = n - a * k;
        ll cnt1 = res % m, cnt2 = m - res % m;
        ll x1 = res / m + 1, x2 = res / m;
        sum = max(sum, a * (a + 1) / 2 * k + (a + 1 + a + cnt1) * cnt1 / 2 * x1 + (a + cnt1 + 1 + a + cnt1 + cnt2) * cnt2 / 2 * x2);
    }
    if (sum >= x)printf("YES %lld\n", sum);
    else puts("NO");
    return 0;
}