codeforces-#478B. Random Teams

         题目大意:有n个人,要分为m个队,做一轮游戏结束后,相互队里相互两个人就会成为朋友,求最多和最少朋友数。

        解题思路:简单推一下就可以知道,最多朋友数为将m-1个队分1个人,剩下的人在一个队里,这样能保证最多,即选取两个人的组合数。而最少的要分情况讨论下,首先均分的情况下能保证最少,这样数量即为除得尽的选取两个人的组合数加上除不尽的即可,详见code。

        题目来源:http://codeforces.com/contest/478/problem/B

        code:

#include 
#include 
#include 
using namespace std;

#define ll __int64
ll n,m,maxm,minm;

int main(){
    //freopen("input.txt","r",stdin);
    while(~scanf("%I64d%I64d",&n,&m)){
        maxm=0;minm=0;
        maxm=(n-m+1)*(n-m)/2;
        ll s=n/m;
        ll l=s*(s-1)/2;
        ll r=s*(s+1)/2;
        if(n%m==0) minm=l*m;
        else{
            minm+=(m-(n%m))*l;
            minm+=(n%m)*r;
        }
        printf("%I64d %I64d\n",minm,maxm);
    }
    return 0;
}


你可能感兴趣的:(codeforces-#478B. Random Teams)