这题的的公式很好推。
先在m个数里进行全排列。由于有相同的,那么就要除去每个相同个数的阶乘。
故有公式:A=(a+b+c+d+........)!/(a! *b! *c! *d!.........)
另外这是个大数,需要用到高精度了。
#include<stdio.h>
int num[250],a[30];
int n,len;
void solve(int m)
{
int carry,tmp,i,j,k;
len=1,num[0]=1;
for(i=2;i<=m;i++){ //求阶乘,模拟乘法。
carry=0;
for(j=0;j<len;j++){
tmp=num[j]*i+carry;
num[j]=tmp%1000;
carry=tmp/1000;
}
if(carry) num[len++]=carry;
}
for(i=0;i<n;i++){ //除法。
for(j=2;j<=a[i];j++){
carry=0;
for(k=len-1;k>=0;k--){
tmp=num[k]+carry*1000;
num[k]=tmp/j;
carry=tmp%j;
}
while(num[len-1]==0) len--;
}
}
}
int main()
{
int sum,i;
while(scanf("%d",&n)&&n){
sum=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
solve(sum);
printf("%d",num[len-1]);
for(i=len-2;i>=0;i--)
printf("%03d",num[i]); //注意格式,输出一个数代表的是三位。而足三位的就没必要补零。
printf("\n");
}
return 0;
}