首页 > 代码库 > hdu 4927 Series 1(组合,java大数)

hdu 4927 Series 1(组合,java大数)

http://acm.hdu.edu.cn/showproblem.php?pid=4927


比赛时分分钟推出来公式后,陷入无限的tle中。起初想处理一遍,但是3000的数量内存装不下,直接编译就不过。为了不超内存,然后又试着把三个数合并为一个,四个数合并一个,100个数合并为一个,还是TLE。。

说到底还是数学不好啊,杨辉三角的第n行的第m个数为组合数c[n-1][m-1]。
应用c[n][m] = c[n][m-1]*(n-m+1)/m,就可以快速递推出第n行的数,这样就能省去预处理的时间以及空间。


import java.io.*;
import java.util.*;
import java.math.*;
import java.math.BigInteger;
public class Main
{
	public static void main(String[] args)
	{
		int test,n;
		Scanner cin = new Scanner(System.in);
		test = cin.nextInt();
		while(test-- > 0)
		{
			n = cin.nextInt();
			BigInteger [] a = new BigInteger [n+10];
			BigInteger [] c = new BigInteger [n+10];
			BigInteger ans = BigInteger.ZERO;
			for(int i = 1; i <= n; i++)
				a[i] = cin.nextBigInteger();
			c[0] = BigInteger.ONE;
			ans = ans.add(c[0].multiply(a[n]));
			int flag = -1;
			for(int i = 1; i < n; i++)
			{
				BigInteger t1 = BigInteger.valueOf(n).subtract(BigInteger.valueOf(i));
				BigInteger t2 = BigInteger.valueOf(i);
				c[i] = c[i-1].multiply(t1).divide(t2);
				if(flag == -1)
					ans = ans.subtract(c[i].multiply(a[n-i]));
				else 
					ans = ans.add(c[i].multiply(a[n-i]));
				flag = -flag;
			}
			System.out.println(ans);
		}
	}
}