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; }