题目地址:Series 1
题目大意:
有一个序列A集合为{A1,A2.....An}。第0个序列为其本身,第一个序列为后一个减去前一个(例:A2-A1,A3-A2...An-An-1)以此类推,则第n-1个序列就一定为一个数。输出这个数。
解题思路:
通过计算求出的这个数ans=aA1+a2A2..anAn。 则前面的系数为杨辉三角里第n行的系数(二项式系数),从最后一个系数符号为正,一正一负一次往前类推。
处理大数问题,用java编写。
代码:
1 import java.util.*; 2 import java.math.*; 3 4 public class Main 5 { 6 public static void main(String []args) 7 { 8 int n,i,j,T; 9 Scanner cin=new Scanner(System.in); //声明输入。 10 BigInteger p[]=new BigInteger[3005]; //声明大数数组 11 T=cin.nextInt(); //输入T 12 while(T!=0) 13 { 14 T--; 15 n=cin.nextInt();//输入n 16 BigInteger minn=BigInteger.valueOf(0),maxx=BigInteger.valueOf(0),c=BigInteger.valueOf(1),tmp,ans;//声明加上赋初值 17 18 for(i=1; i<=n; i++) 19 p[i]=cin.nextBigInteger(); 20 21 for(i = 0; i<=n-1; i++) //从0开始,为了计算杨辉三角的系数符号从最后一个为正开始。 22 { 23 if(i>0) //除数不能为0 24 { 25 BigInteger xxx=BigInteger.valueOf(n-i); //乘上分母的最大的一个数 26 c=c.multiply(xxx)/*相乘*/.divide/*相除*/(BigInteger.valueOf(i));//除去分子最小的一个数//通过计算出最后一个系数,依次计算出前一个的系数 27 } 28 tmp=c.multiply(p[n-i]); 29 if(i%2==1) 30 minn=minn.add(tmp);//相加 31 else 32 maxx=maxx.add(tmp); 33 } 34 maxx=maxx.subtract(minn); //正的值减去负数的值 35 System.out.println(maxx.toString());//输出 36 } 37 } 38 }