前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【HDU - 4927】Series 1

【HDU - 4927】Series 1

作者头像
饶文津
发布2020-06-02 15:07:48
2260
发布2020-06-02 15:07:48
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

BUPT2017 wintertraining(15) #5I

题意

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

题解

观察可知答案就是

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

需要用大整数。

代码

Java代码
代码语言:javascript
复制
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++代码
代码语言:javascript
复制
#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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 题解
  • 代码
    • Java代码
      • C++代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档