题解:CF478B Random Teams

· · 题解

我们先来看最小值。

有点类似于找次品一类问题的思想,让每一组人数尽可能平均,可以得到最小值。

然后再来看最大值。

手推几组数据可以发现,当某一组人数越多时答案会越大。所以我们可以把前 m-1 组的人数都设为 l ,最后一组的人数设为 n-m+1 ,这样可以得到最大值。

AC Code

#include <bits/stdc++.h>
using namespace std;
long long n, m;
long long f(long long x) {
    return x * (x - 1) / 2;
}
int main() {
    cin >> n >> m;
    if (n < m) {
        cout << 0 << " " << 0 << endl;
        return 0;
    }
    long long k = n % m;
    cout << k * f(n / m + 1) + (m - k) * f(n / m) << " " << f(n - m + 1) << endl;
    return 0;
}