字串数(高精度组合数)

字串数

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;
原文地址:https://www.cnblogs.com/a1225234/p/4602026.html