8635 气球
8635 气球该题有题解 时间限制:500MS 内存限制:1000K 题型: 编程题 语言: G++;GCC
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
来源Ick2
作者admin |
运用数学的平均分配原则,数据数组结尾没有'\0'
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int n,m,a[5],b[15]={0},i,j,x,top; 6 scanf("%d%d",&n,&m); 7 for(i=0;i<m;i++) 8 {scanf("%d",&a[i]);b[a[i]]+=1;} 9 /*for(i=0;i<m;i++) 10 printf("%d ",a[i]); 11 printf("\n");*/ 12 13 int sum1=1; 14 for(i=0;i<m;i++) 15 { 16 top=a[i]; 17 for(j=0;j<top;j++) 18 sum1=sum1*(n-j); 19 20 n=n-a[i]; 21 } 22 for(i=0;i<m;i++) 23 { 24 top=a[i]; 25 for(j=0;j<top;j++) 26 sum1=sum1/(top-j); 27 n=n-a[i]; 28 } 29 30 31 32 for(i=0;i<m;i++) 33 { 34 for(j=i+1;j<m;j++) 35 { 36 if(a[j]==a[i]) 37 {a[j]=0; 38 continue;} 39 } 40 } 41 42 43 x=0; 44 for(i=0;i<m;i++) 45 { 46 if(a[i]==0) 47 { 48 i++; 49 continue; 50 } 51 else 52 { 53 a[x]=a[i]; 54 x++; 55 i++;} 56 } 57 58 /*for(i=0;i<x;i++) 59 printf("%d ",a[i]); 60 printf("\n");*/ 61 62 int sum2=1; 63 for(i=0;i<x;i++) 64 { 65 66 for(j=0;j<b[a[i]];j++) 67 { 68 sum2=sum2*(b[a[i]]-j); 69 } 70 } 71 72 printf("%d",sum1/sum2); 73 return 0; 74 }

浙公网安备 33010602011771号