题意:
给定一个长度为n的序列ai,每次操作相邻两个数相减,得到一个长度-1的新序列,n-1次操作后徐连变成一个整数,输出整数的值。
题解:
我们弄几个数操作下就能发现ans=∑(-1)^i*C(n-1,i)*a(n-i),(0<=i<=n-1),C(n-1,i)为组合数。这样我们只要处理好组合数的计算就可以了,n<=3000,所以组合数很大,需要大数处理,用C++的话处理大数很麻烦,直接用java写了。
很久没写过java了,这次就将这个记录下吧。
代码:
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int T,n;
BigInteger a[]=new BigInteger[10000];
T=cin.nextInt();
while(T!=0)
{
T--;
n=cin.nextInt();
int i,j,k;
for(i=0;i<n;i++)a[i]=cin.nextBigInteger();
BigInteger ans=BigInteger.ZERO;
BigInteger c=BigInteger.ONE;
BigInteger d=BigInteger.ONE;
for(i=0;i<n;i++)
{
d=c.multiply(a[n-1-i]);
//System.out.println(d.toString());
if(i%2==0)ans=ans.add(d);
else ans=ans.subtract(d);
c=c.multiply(BigInteger.valueOf(n-1-i));
c=c.divide(BigInteger.valueOf(i+1));
//System.out.println("*"+ans.toString());
}
System.out.println(ans.toString());
}
}
}