C – 字串数
一个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<stdio.h>
#include<string.h>
int a[1001];
int n;
int word[27];
void mult(int n) {
memset(a,0,sizeof(a));
int i,j,c,k;
a[0]=1;
for(i=2; i<=n; i++) {
c=0;
for(j=0; j<1001; j++) {
k = a[j]*i+c;
a[j]=k%10;
c=k/10;
}
}
}
int mult2(int n) {
int k = 1;
for(int i=1; i<=n; i++)
k=k*i;
return k;
}
int div(int *a,int k) {
long long d =0;
int i;
for(i=1001-1; i>=0; i--)
if(a[i]!=0)
break;
for(; i>=0; i--) {
d = d*10+a[i];
a[i]=d/k;
d=d%k;
}
}
int main() {
while(~scanf("%d",&n) && n!=0) {
memset(word,0,sizeof(word));
int all=0;
for(int i=1; i<=n; i++) {
scanf("%d",&word[i]);
all+=word[i];
}
mult(all);
for(int i=1; i<=n; i++) {
div(a,mult2(word[i]));
}
int i;
for(i=1001-1; i>=0; i--)
if(a[i]!=0)
break;
for(; i>=0; i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}