题意:一个n个数字的序列,每次生产一个新序列 b[i]=a[i+1]-a[i] 显然每次少一个数,知道只剩一个数,问最后一个数是多少。
思路:很容易能推出规律,ans= sigma((-1)^(i)*c(n-i,i)*a[n-i])
最后加个java大数就好了
import sun.awt.image.PixelConverter;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* Created by dell on 2016/7/7.
*/
public class Main {
BigInteger x0=new BigInteger("0");
BigInteger x1=new BigInteger("1");
BigInteger x2=new BigInteger("2");
BigInteger x3=new BigInteger("3");
BigInteger x4=new BigInteger("4");
BigInteger x5=new BigInteger("5");
BigInteger x6=new BigInteger("6");
BigInteger[] a=new BigInteger[3111];
/*
Map<BigInteger,BigInteger>vis=new HashMap<BigInteger, BigInteger>();
BigInteger dfs(BigInteger n) {
if(vis.get(n)!=null) {
return vis.get(n);
}
BigInteger k=n.divide(x2);
BigInteger k1=k.subtract(x1);
BigInteger ans=x0;
if(n.mod(x2).compareTo(x1)==0) {
ans=dfs(k).multiply(x4).add(k.multiply(x6));
vis.put(n,ans);
return ans;
}
else {
ans=dfs(k).multiply(x2).add(dfs(k1).multiply(x2).add(k.multiply(x4).subtract(x4)));
vis.put(n,ans);
return ans;
}
}*/
void work() {
Scanner cin = new Scanner(System.in);
int n;
int t;
t=cin.nextInt();
for(int cas=1;cas<=t;cas++) {
n=cin.nextInt();
for(int i=1;i<=n;i++)
a[i]=cin.nextBigInteger();
BigInteger ans=x0;
BigInteger c=x1;
for(int i=0;i<n;i++) {
BigInteger tmp=c.multiply(a[n-i]);
// System.out.println(tmp);
if(i%2==0) {
ans=ans.add(tmp);
}
else {
ans=ans.subtract(tmp);
}
//22 System.out.println(ans);
tmp=c.multiply(BigInteger.valueOf(n-i-1));
c=tmp.divide(BigInteger.valueOf(i + 1));
}
System.out.println(ans);
}
}
public static void main(String[] args){
Main e=new Main();
e.work();
}
}