一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA".
给定若干字母和它们相应的个数,计算一共可以组成多少个不同的字符串.
Input
每组测试数据分两行,第一行为n(1<=n<=26),表示不同字母的个数,第二行为n个数A1,A2,…,An(1<=Ai<=12),表示每种字母的个数.测试数据以n=0为结束.
Output
对于每一组测试数据,输出一个m,表示一共有多少种字符串.
Sample Input
2
1 2
3
2 2 2
0
Sample Output
3
90
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main()
{
int n,a[30],sum[501];//sun储存结果
int s2[400];//存储i便于计算
while(cin>>n&&n)
{
int i,j,k;
int s=0;
for(i=1; i<=n; i++)
{
cin>>a[i];
s+=a[i];
}
for(i=1; i<=s; i++) //记录所有个数
{
s2[i]=i;
}
for(k=1; k<=n; k++)
{
for(j=2; j<=a[k]; j++)
{
int m=j;
while(m>1)
{
for(i=1; i<=s; i++)
{
int m1=gcd(s2[i],m);
m=m/m1;
s2[i]=s2[i]/m1;
}
}
}
}
memset(sum,0,sizeof(sum));
//cout<<m<<endl;
sum[0]=1;
for(i=1; i<=s; i++) //模拟相乘没有约去的值
{
//cout<<s2[i]<<" ";
int flag=0;
if(s2[i]!=1)
{
for(j=0; j<=500; j++)
{
int ss=sum[j]*s2[i]+flag;
sum[j]=ss%10;
flag=ss/10;
}
}
//s1*=s2[i];
}
for(i=500; !sum[i]; i--);
//cout<<i<<endl;
{
for(j=i; j>=0; j--)
{
cout<<sum[j];
}
}
cout<<endl;
}
return 0;
}