字串数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3581 Accepted Submission(s):
878
点我
Problem Description
一个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
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cmath> 8 #include <vector> 9 using namespace std; 10 const int maxn=1000; 11 const int base=1000000; 12 const int INF=99999999; 13 const int MIN=-INF; 14 int a[maxn]; 15 void mul(int n) 16 { 17 int i,j,k; 18 memset(a,0,sizeof(a)); 19 a[0]=1; 20 for(i=2;i<=n;i++) 21 { 22 int c=0; 23 for(j=0;j<maxn;j++) 24 { 25 k=a[j]*i+c; 26 a[j]=k%10; 27 c=k/10; 28 } 29 } 30 } 31 void div(int*a,int k) 32 { 33 int i; 34 for(i=maxn-1;i>=0;i--)if(a[i]!=0)break; 35 long long div=0;//定义成long long 不然计算过程中会溢出 36 for(;i>=0;i--) 37 { 38 div=div*10+a[i]; 39 a[i]=div/k; 40 div%=k; 41 } 42 } 43 int mul2(int n) 44 { 45 int i; 46 int k=1; 47 for(i=1;i<=n;i++) 48 k*=i; 49 return k; 50 } 51 int main() 52 { 53 int n,m,i,j,k,t; 54 while(cin>>n&&n) 55 { 56 int sum=0,c[maxn]; 57 for(i=0;i<n;i++) 58 cin>>c[i],sum+=c[i]; 59 60 mul(sum); 61 for(i=0;i<n;i++) 62 div(a,mul2(c[i])); 63 64 for(i=maxn-1;i>=0;i--)if(a[i]!=0)break; 65 66 for(;i>=0;i--) 67 cout<<a[i]; 68 cout<<endl; 69 } 70 return 0;