B. Random Teams
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

n participants of the competition were split into m teams in some manner so that each team has at least one participant. After the competition each pair of participants from the same team became friends.

Your task is to write a program that will find the minimum and the maximum number of pairs of friends that could have formed by the end of the competition.

Input

The only line of input contains two integers n and m, separated by a single space (1 ≤ m ≤ n ≤ 109) — the number of participants and the number of teams respectively.

Output

The only line of the output should contain two integers kmin and kmax — the minimum possible number of pairs of friends and the maximum possible number of pairs of friends respectively.

Sample test(s)
Input
5 1
Output
10 10
Input
3 2
Output
1 1
Input
6 3
Output
3 6
Note

In the first sample all the participants get into one team, so there will be exactly ten pairs of friends.

In the second sample at any possible arrangement one team will always have two participants and the other team will always have one participant. Thus, the number of pairs of friends will always be equal to one.

In the third sample minimum number of newly formed friendships can be achieved if participants were split on teams consisting of 2 people, maximum number can be achieved if participants were split on teams of 1, 1 and 4 people.

算法分析:1.  n-1 个队有一个人,其余人都放到地n队,这样组合出来最多。

2.  将n个人尽量均分到每个队,这样获得组合最少。

3.  m==1  和  m==n的情况进行一下剪枝。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm> using namespace std; int main()
{
long long n, m;
long long dd, ff, gg, d;
long long mi, ma; while(scanf("%lld %lld", &n, &m)!=EOF) //鉴于此处为什么用long long,我也不清楚,就因为这两处的数据类型,我WA了8遍。
{
if(m==1)
{
dd=n*(n-1)/2;
printf("%lld %lld\n", dd, dd);
continue;
}
if(n==m)
{
printf("0 0\n");
continue;
}
dd=n-(m-1);
ma=dd*(dd-1)/2; ff=n/m;
gg=n%m;
d=n-ff*m; mi=ff*(ff-1)/2*(m-d);
mi=mi+ff*(ff+1)/2*d; if(mi>ma)
{
mi=mi^ma; ma=ma^mi; mi=mi^ma;
}
printf("%lld %lld\n", mi, ma );
}
return 0;
}

最新文章

  1. bind模拟
  2. 【译】RabbitMQ:远程过程调用(RPC)
  3. 初识canvas,使用canvas做一个百分比加载进度的动画
  4. git中使用.gitignore文件
  5. 如何删除href=&quot;&quot;中的链接?
  6. Oralce常用维护命令
  7. Linux服务器的常用备份方法
  8. BZOJ2661: [BeiJing wc2012]连连看
  9. InstallShield: cannot extract icon with index 0错误解决方案
  10. 【转】Memcached管理与监控工具----MemAdmin
  11. Matlab基于学习------------------函数微分学
  12. 快速批量插入sqlserver方法之我见
  13. VUE2.0实现购物车和地址选配功能学习第四节
  14. 邓_phpcms_phpcms授课思路复习
  15. H5 Canvas图像模糊解决办法
  16. highcharts 具体参数详解
  17. 关于两栏布局,三栏布局,一级点击三角触发select的onchange事件问题
  18. 《CSAPP》符号解析
  19. php7连接 sqlserver踩过的坑,could not find driver解决方式
  20. SpringBoot整合Graylog3.0

热门文章

  1. TreeSet, LinkedHashSet and HashSet 的区别
  2. jar word 模板操作比较好用的工具
  3. IntelliJ IDEA常用统一设置2-Inspections检查设置(Linux/Mac/Windows)
  4. sql server trace
  5. How to Use Dtrace Tracing Ruby Executing
  6. Projective Texture的原理与实现 【转】
  7. hql 时间
  8. vue2.0 自定义指令
  9. openCV2马拉松第18圈——坐标变换
  10. Tessellation (曲面细分) Displacement Mapping (贴图置换)