题目:Random Teams
题意:将N个人分成M组,每组至少一人。在比赛结束时,同一组的人两两之间都会成为朋友。不同分组的分组方案得到的朋友对数不同。
要问最少和最多各是多少。
对于一个有a个人的组,利用组合数我们可以知道这个组可以有a*(a-1)/2对朋友诞生。
所以,要让对数少的话,就是a要尽量少,每一组的人数均摊些。否则就是a尽量大,大家都挤一块去。
由于N可能不能被M整除,所以求最少的时候,要注意存在一些组的人数是N/M,其他是N/M+1,分开算完加起来便是。
而求最大就是一组N-M+1个人,剩下M-1组都是1个人。
#include<cstdio>
long long n, m, ans;
long long cal(long long a){
return a*(a-1)/2;
}
int main(){
while(~scanf("%I64d %I64d", &n, &m)){
long long a = n/m;
printf("%I64d %I64d\n", cal(a)*(m-n%m) + cal(a+1)*(n%m), cal(n-m+1));
}
return 0;
}