HDOJ 1223 java大整数递推

又有月赛了  虽然已经是大四实习的老人了 但是还是没忍住做了一题。。

翻了一道没人A的题看了下~

大致题意是有N个数,请问有多少种大小关系

比如3个数就是:

1) A=B=C
2) A=B<C
3) A<B=C
4) A<B<C
5) A<C<B
6) A=C<B
7) B<A=C
8) B<A<C
9) B<C<A
10) B=C<A
11) C<A=B
12) C<A<B
13) C<B<A


抽象一下,可以看作是,N个球放到盒子里的模型。

答案是:N个球放到 1,2,...N个盒子里的个数之和


A[i] 表示N个球放到i个盒子里面的方式数(每个盒子至少都有一个球)

i^N 表示N个球任意放到i个盒子的方式,因为随便放的,所以可能有的盒子并没有球,所以要减去没有球的方案数


A[1] = 1

A[2] = 2^N - C(1,2) *A[1]

A[3] = 3^N - C(1,3) *A[1] -C(2,3) *A[2]

。。。。


竟然还是大整数 果断java搞之~

样例给的输入输出竟然还是错的,要2个换行,贡献了一个PE~


import java.math.BigInteger;
import java.util.Scanner;


public class Main {
	static BigInteger [][]C = new BigInteger[55][55];
	static void  getC()
	{
		int i,j;
		C[0][0] = BigInteger.ZERO;
		for(i=1;i<55;++i)
			C[0][i] = BigInteger.ONE;
		for(i=1;i<55;++i)
		{
			for(j=1;j<i;++j)
			{
				C[j][i] = C[j][i-1].add(C[j-1][i-1]);
			}
			C[i][i] = BigInteger.ONE;
		}
	}


	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int T,N,i,j;
		BigInteger A[] = new BigInteger[55];
		BigInteger sum;
		
		getC();
		
		T = sc.nextInt();
		while(T-- !=0)
		{
			N = sc.nextInt();
			A[1] = BigInteger.ONE;
			sum=A[1];
			for (i=2;i<=N;++i)
			{
				A[i] =  BigInteger.valueOf(i).pow(N);
 				for (j=1;j<=i-1;++j)
				{
					A[i]= A[i].subtract(C[j][i].multiply(A[j]));
				}
				sum = sum.add(A[i]);
			}
			System.out.printf("%d\n\n",sum);
		}
		}

}


你可能感兴趣的:(java,c,String,Class,import)