省赛来了
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述
一年一度的河南省程序设计大赛又要来了。
竞赛是要组队的,组队形式:三人为一队,设队长一名,队员两名。
现在问题就来了,给你m个人,要求每队n个人,求共有几种不同的组队方式。
(题目保证m%n等于0,所有数据不超出int范围)
输入多组测试数据,以EOF结束。
每组测试数据输入两个整数m,n。输出对每组测试数据输出不同组队方式的数量(考虑到输出的数可能会很大,所以请输出对2013取余后的值),并在输出结束之后输入一个换行符。
样例输入4 2
样例输出6
来源NYIST校赛选拔赛
/*
* 思路分析:
* 对于此题可以想到排列组合问题
* 这里正是根据排列组合公式C(M,N)=M!/(N!*(M-N)!),把每组可可能性种类列出,再求集
* 比如对于例子: 4 2
* 根据题意知:
* 每组2个
* 第一组的种类有:
* C(4,2)={[4x(4-1)x(4-2)x(4-3)x(4-4+1)]/[2x(2-1)x(2-2+1)]}/[2x(2-1)x(2-2+1)]=[(4x3x2x1)/2]/2=6种
* 第二组有:C(2,2)=1种
* 同理:6 2
* 结果为C(6,2)*C(4,2)*C(2,2)
* 由此大家明白思路了吧。
* 如下代码:
*/
import java.util.Scanner;
public class Main {
// 返回排列组合结果
public static int f(int m, int n) {
int sum = 1, temp = 1;
// 求m!/n!
for (int i = m; i > n; i--) {
sum *= i;
}
// 求(m-n)!
for (int i = 2; i <= m - n; i++) {
temp *= i;
}
return sum / temp;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m, n, ret;
while (true) {
try {
m = sc.nextInt();
n = sc.nextInt();
ret = 1;
while (m >= n) {
ret *= f(m, n);
m = m - n;
}
System.out.println(ret % 2013);
} catch (Exception e) {
return;
}
}
}
}