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题意:给出n个字母及每个字母的个数,求能构成多少组不同的字符串思路:假设有k个个字母,每个字母的个数分别为n1,n2,...,nk,则相应的解为(n1+n2+...+nk)! / n1! / n2! .../nk!,在计算时,涉及到大整数乘法和除法代码如下:import java.io.FileInputStream; import java.io.OutputStreamWriter; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Scanner; import java.math.BigInteger; public class Main implements Runnable { private static final boolean DEBUG = false; private Scanner cin; private PrintWriter cout; private static final int N = 26; private static final int M = 13; private int n; private final int[] c = new int[N]; private int sum; private BigInteger[] big = new BigInteger[M]; private void init() { try { if (DEBUG) { cin = new Scanner(new InputStreamReader(new FileInputStream("f:\\OJ\\uva_in.txt"))); } else { cin = new Scanner(new InputStreamReader(System.in)); } cout = new PrintWriter(new OutputStreamWriter(System.out)); } catch (Exception e) { e.printStackTrace(); } big[0] = BigInteger.ZERO; big[1] = BigInteger.ONE; for (int i = 2; i < M; i++) { big[i] = big[i - 1].multiply(BigInteger.valueOf(i)); } } private boolean input() { n = cin.nextInt(); if (n == 0) return false; sum = 0; for (int i = 0; i < n; i++) { c[i] = cin.nextInt(); sum += c[i]; } return true; } private void solve() { BigInteger ans = BigInteger.ONE; for (int i = 2; i <= sum; i++) { ans = ans.multiply(BigInteger.valueOf(i)); } for (int i = 0; i < n; i++) { ans = ans.divide(big[c[i]]); } cout.println(ans.toString()); cout.flush(); } @Override public void run() { init(); while (input()) { solve(); } } public static void main(String[] args) { // TODO code application logic here new Thread(new Main()).start(); } }