hdu1261字串数(排列组合+大数)

来源:互联网 发布:向mac势力低头 表情包 编辑:程序博客网 时间:2024/05/17 16:01

一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA". 
给定若干字母和它们相应的个数,计算一共可以组成多少个不同的字符串. 
Input
每组测试数据分两行,第一行为n(1<=n<=26),表示不同字母的个数,第二行为n个数A1,A2,...,An(1<=Ai<=12),表示每种字母的个数.测试数据以n=0为结束. 
Output
对于每一组测试数据,输出一个m,表示一共有多少种字符串. 
Sample Input
21 232 2 20
Sample Output
390


该题目直接是有公式可以得出结论的。

比如,我们有n个类别,每个类别有ai个值,一共有(a1+a2+a3+a4+......+an=sum)求sum个可以排列成多少中情况。

结果是

((a[0]+a[2]+…a[n-1])!)/(a[0]!∗a[1]!∗…a[n-1]!)

由于存在溢出的情况,

可以考虑使用java来做

import java.util.*;import java.math.*;public class Main{public static void main(String[] args) {// TODO Auto-generated method stubScanner cin=new Scanner(System.in);while(cin.hasNext()) {int n=cin.nextInt();if(n==0)break;int []mon=new int[n];int sum=0;for(int i=0;i<n;i++) {mon[i]=cin.nextInt();sum+=mon[i];}BigInteger ans_up,temp;ans_up=BigInteger.valueOf(1);for(int i=1;i<=sum;i++) {ans_up=ans_up.multiply(BigInteger.valueOf(i));}//ans=BigInteger.valueOf(1);for(int i=0;i<n;i++) {temp=BigInteger.valueOf(1);for(int j=1;j<=mon[i];j++)temp=temp.multiply(BigInteger.valueOf(j));ans_up=ans_up.divide(temp);}System.out.println(ans_up);}}}


原创粉丝点击