ZOJ 1202 Divide and Count(排列组合)
Divide and Count
题目大意:给定箱子的数量和每个箱子的容量,在每个箱子里都装满对应容量的宝石,每颗宝石都是独一无二的,求一共有多少种放置方式。但是如果两个箱子的容量相同,则认为是 同一种箱子
Sample input:
2 3 3 3 1 2 3
Sample output:
10 60
分析:这是练习赛的时候处在HUST上的题目,当时感觉代码完全对了,却坑了半天,看了题解才发现,是最后除以相同的箱子的时候,是除以它的数量的阶乘,本来是这么想的,却先把它们给乘起来了,样例只是碰巧对而已。也用不到64位整数。
代码如下:
1 #include <iostream> 2 # include<cstdio> 3 # include<cstring> 4 using namespace std; 5 6 int f(int a,int b) //从a到b的乘积 7 { 8 int i; 9 int ans= 1; 10 for(i=a; i<=b; i++) 11 { 12 ans *= i; 13 } 14 return ans; 15 } 16 int main() 17 { 18 int i,T,sum,hh,ans; 19 int num[13],a[13]; 20 while(scanf("%d",&T)!=EOF) 21 { 22 23 sum = 0; 24 for(i=0; i<=12; i++) 25 a[i]=0; 26 for(i=0; i<T; i++) 27 { 28 scanf("%d",&num[i]); 29 a[num[i]]++; 30 sum += num[i]; 31 } 32 ans =1; 33 for(i=0; i<T; i++) 34 { 35 ans *= f(sum-num[i]+1,sum)/f(1,num[i]); 36 sum -= num[i]; 37 } 38 for(i=0; i<=12; i++) 39 { 40 if(a[i]>1) 41 ans /= f(1,a[i]); //这里除以阶乘 42 } 43 printf("%d\n",ans); 44 } 45 return 0; 46 }
把每一件简单的事情做好,就是不简单;把每一件平凡的事情做好,就是不平凡!相信自己,创造奇迹~~