Divide and Count
题目大意:给定箱子的数量和每个箱子的容量,在每个箱子里都装满对应容量的宝石,每颗宝石都是独一无二的,求一共有多少种放置方式。但是如果两个箱子的容量相同,则认为是 同一种箱子
Sample input:
23 331 2 3Sample output:
1060
分析:这是练习赛的时候处在HUST上的题目,当时感觉代码完全对了,却坑了半天,看了题解才发现,是最后除以相同的箱子的时候,是除以它的数量的阶乘,本来是这么想的,却先把它们给乘起来了,样例只是碰巧对而已。也用不到64位整数。
代码如下:
1 #include2 # include 3 # include 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 1)41 ans /= f(1,a[i]); //这里除以阶乘42 }43 printf("%d\n",ans);44 }45 return 0;46 }