B. Random Teams(数学题)

 

题意:有n个人要被分到m个队伍中,组成一个队伍中的人,每两个人会成为一对朋友,求最多和最少有几对朋友。

题解:一个组里的朋友对数,用排列组合来计算,我们发现基数越大的,朋友数会成倍增加,所以,最大的朋友数就是让人尽可能的都在一个队伍中,这样产生的朋友数是最大的。最小,当然就是让计数尽可能的小。我们分为两种:如果人数刚好平分,那么此时就是最大;但是如果无法整除,我们就应该将多余的人,按每队最多一人,分给m个队伍,这样达到的结果是最小的。

ACcode:

ll f(ll x)
{
    if (x % 2 == 0)
        return x / 2 * (x - 1);
    else return (x - 1) / 2 * x;//排列组合的计算
}
int main()
{
    ll n, m;
    ll minn, maxx;
    cin >> n >> m;
    maxx = f(n - m + 1);//最大值就是满足每队至少一人,把剩下人集中在一个队伍中
    minn = (m-(n%m))*f(n/m) + f(n/m+1)*(n%m);//+号前面是计算有多少不用分配到余数的队伍的朋友数,后面是计算加入人的队伍朋友数。
    cout << minn << " " << maxx;
    return 0;
}

 

posted @ 2021-08-10 16:28  Uiney  阅读(49)  评论(0编辑  收藏  举报