我又来了,这是今天最后一道题咯~~作为新手,一天打这么多~这么久~的代码,还是真的觉得神疲力竭啊~
好了,接下来要说的一道题,应该只能说是一道数学题,不过数学题也是能够体现一些思想滴~~好好琢磨才是王道
===========================================================================================================
Description
一天,OYY 从外面打完比赛回来,手上拿了很多个气球,颜色各不相同。他见到我,就说,你看,我拿了很多气球!
我膜拜死了!!然后他就问了我一个问题,如果把这里的气球分成若干份。有多少种分法呢?
由于我数学非常菜,顿时头晕了,因此希望大家能帮我解答这个问题(@_@))
输入格式
输入数据有2行
第1 行有两个数n,m,分别代表oyy 手上的气球个数和分的份数(n<=10,m<=5)
第2 行有m 个数,分别代表每一份的个数,保证总个数等于n
输出格式
输出数据有1行,输出一个数代表不同分法的总数。
输入样例
3 1
3
输出样例
1
提示
Sample Input2:
4 2
2 2
Sample Output2:
3
===========================================================================================================
===========================================================================================================
#include <stdio.h>
int C(int a, int b)
{
int tmp = 1;
for (int i = 1; i <= a; ++i)
tmp *= b--;
for (int i = 1; i <= a; ++i)
tmp /= i;
return tmp;
}
int fact(int div)
{
int sum = 1;
while (div)
sum *= div--;
return sum;
}
int main()
{
int sum = 1;
int n, m, mt[5] = { 0 };
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++i) {
scanf("%d", &mt[i]);
}
for (int i = 0; i < m; ++i) {
sum *= C(mt[i], n);
n -= mt[i];
}
for (int i = 0; i < 4; ++i) {
int divisor = 1;
for (int j = i + 1; j < 5 && mt[i] != 0; ++j) {
if (mt[i] == mt[j]) {
divisor++;
mt[j] = 0;
}
}
sum /= fact(divisor);
}
printf("%d\n", sum);
return 0;
}
===========================================================================================================