HDOJ---1261 字串数[组合+大数]

 

字串数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1877    Accepted Submission(s): 367


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
 

 

Source
 

 

Recommend
JGShining
 
 
 
 
 
 
 
 
code:
 1 /*

 2 设多重集的个数n = n1 + n2 + ... + nk;

 3 则该多重集的排列个数为:n!/(n1!n2!...nk!).

 4 */

 5 import java.util.*;

 6 import java.math.*;

 7 public class Main

 8 {

 9     public static void main(String []args)

10     {

11         Scanner cin=new Scanner(System.in);

12         int n;

13         int sum;

14         int []data=new int[27];

15         BigInteger a,b;

16         while(cin.hasNext())

17         {

18             n=cin.nextInt();

19             if(n==0)

20                 break;

21             sum=0;            

22             for(int i=0;i<n;i++)

23             {

24                data[i]=cin.nextInt();

25                sum+=data[i];

26             }

27             a=BigInteger.valueOf(1);

28             for(int i=2;i<=sum;i++)

29                 a=a.multiply(BigInteger.valueOf(i));

30             for(int i=0;i<n;i++)

31             {

32                 b=BigInteger.valueOf(1);

33                 for(int j=2;j<=data[i];j++)

34                     b=b.multiply(BigInteger.valueOf(j));

35                 a=a.divide(b);

36             }

37             System.out.println(a);

38         }

39     }

40 }

你可能感兴趣的:(组合)