• 【HDU


    BUPT2017 wintertraining(15) #5I

    题意

    输出序列A[1..n]的第n-1阶差分(一个整数)。

    题解

    观察可知答案就是

    [sum_{i=0}^{n-1} {(-1)^{i}C_n^{i} A_{n-i}} ]

    需要用大整数。

    代码

    Java代码

    import java.io.*;
    import java.math.*;
    import java.util.*;
    import java.text.*;
    
    public class Main{
    	public static void main(String[] argc){
    		Scanner cin = new Scanner (new BufferedInputStream(System.in));
    		int T = cin.nextInt();
    		while(T>0){
    			--T;
    			int n = cin.nextInt();
    			BigInteger a, t, x;
    			a = BigInteger.ZERO;
    			t = BigInteger.ONE;
    			for (int i = 1; i <= n; ++i){
    				BigInteger b = BigInteger.ONE;
    				if (i >= 2){
    					t = t.multiply(BigInteger.valueOf(n-i+1));
    					t = t.divide(BigInteger.valueOf(i-1));
    				}
    				x = cin.nextBigInteger();
    				b = b.multiply(t);
    				b = b.multiply(x);
    				if (1 == (n - i) % 2) a = a.subtract(b);
    				else a = a.add(b);
    			}
    			System.out.println(a);
    		}
    	}
    }
    

    C++代码

    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define N 3005
    #define base 10000
    struct Big{
    	int d[1000];
    	int k,l;
    	Big(){l=k=0;}
    	Big(int d){input(d);}
    	void input(int n){
    		memset(d,0,sizeof d);
    		k=0;
    		if(n==0) l=1;
    		else for(l=0;n;n/=base)d[l++]=n%base;
    	}
    	void output()const{
    		if(k&&l&&d[l-1])printf("-");
    		printf("%d",d[l-1]);
    		for(int i=l-2;i>=0;i--)printf("%04d",d[i]);
    	}
    	bool operator <(const Big &b)const{
    		int i=l-1,j=b.l-1;
    		if(i!=j)return i<j;
    		while(i>=0&&d[i]==b.d[j]){i--;j--;}
    		return d[i]<b.d[j];
    	}
    	Big operator * (const Big &b)const{
    		Big c;
    		memset(c.d,0,sizeof c.d);
    		for(int i=0;i<l;i++)
    			for(int j=0;j<b.l;j++){
    				c.d[i+j]+=d[i]*b.d[j];
    				if(c.d[i+j]>=base){
    					c.d[i+j+1]+=c.d[i+j]/base;
    					c.d[i+j]%=base;
    				}
    			}
    		c.l=l+b.l;
    		if(c.l>1&&!c.d[c.l-1])c.l--;
    		return c;
    	}
    	Big operator * (int b)const{
    		Big c;
    		c.input(b);
    		return *this*c;
    	}
    	Big operator / (int b)const{
    		Big c;
    		int i,k=0;
    		c.l=l;
    		for(i=l-1;i>=0;i--){
    			c.d[i]=(k+d[i])/b;
    			k=(k+d[i])%b*base;
    		}
    		while(c.l>1&&!c.d[c.l-1])c.l--;
    		return c;
    	}
    	Big operator + (const Big &b)const{
    		Big c=*this;
    		int k=0;
    		for(int i=0;i<b.l||i<l;i++){
    			if(i<b.l)c.d[i]+=b.d[i];
    			c.d[i]+=k;
    			k=0;
    			if(c.d[i]>=base){
    				c.d[i]-=base;
    				k=1;
    			}
    		}
    		if(b.l>l)c.l=b.l;
    		if(k)c.d[c.l++]=1;
    		return c;
    	}
    	Big operator - (const Big &b)const{
    		Big c=*this;
    		for(int i=0;i<b.l;i++){
    			c.d[i]-=b.d[i];
    			if(c.d[i]<0){
    				c.d[i]+=base;
    				c.d[i+1]--;
    			}
    		}
    		while(c.l>1&&!c.d[c.l-1])c.l--;
    		return c;
    	}
    }a[N];
    int T,n;
    void add(Big &a,Big b){
    	if(a.k^b.k){
    		if(b<a) a=a-b;
    		else a=b-a,a.k=b.k;
    	}else a=a+b;
    }
    void sub(Big &a,Big b){
    	if(a.k^b.k) a=a+b;
    	else if(b<a) a=a-b;
    	else a=b-a,a.k^=1;
    }
    int main(){
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);
    		for(int i=1,d;i<=n;i++){
    			scanf("%d",&d);
    			a[i].input(d);
    		}
    		Big c(1);
    		int k=n%2;
    		Big ans=a[1];
    		if(!k)ans.k=1;
    		for(int i=1;i<n;i++){
    			c=c*(n-i)/i;
    			k^=1;
    			Big t=c*a[i+1];
    			if(k) add(ans,t);
    			else sub(ans,t);
    		}
    		ans.output();
    		puts("");
    	}
    }
    

    相关题目 Series 2

  • 相关阅读:
    World Cup
    Eva's Problem
    Number-guessing Game
    WisKey的眼神
    Vowel Counting
    The 3n + 1 problem
    超级楼梯
    母牛的故事
    素数回文
    画8
  • 原文地址:https://www.cnblogs.com/flipped/p/HDU4927.html
Copyright © 2020-2023  润新知