题意非常easy:

对于长度为n的数。做n-1遍。生成的新数列:

b1=a2-a1   b2=a3-a2  b3=a4-a3

c1=b2-b1   c2=b3-b2

ans=c2-c1

最后推出公式:  为n所在行的杨辉三角

对于例子:

3

1 2 3

ans=1*1-2*2+1*3=0

4

1 5 7 2

ans=-1*1+3*5-3*7+1*2=-5

求杨辉三角每一个数的时候能够优化一下,后一个数由前一个各乘除一次就好了

JAVA用大数秒A。

BUT 不会JAVA  - -#

蛋疼用C++模拟大数。。

#include "stdio.h"
#include "string.h"
int a[3010];
__int64 mark[3010],ans[3010],c[3010];
int Max(int a,int b)
{
if (a<b) return b;else return a;
} void make_mul(int x)
{
int i;
for (i=1;i<=mark[0];i++)
mark[i]*=x; for (i=1;i<=mark[0];i++)
{
mark[i+1]+=mark[i]/1000000;
mark[i]%=1000000;
}
while (mark[mark[0]+1]!=0)
{
mark[0]++;
mark[mark[0]+1]=mark[mark[0]]/1000000;
mark[mark[0]]%=1000000;
} } void make_div(int x)
{
int i;
for (i=mark[0];i>=2;i--)
{
mark[i-1]+=(mark[i]%x)*1000000;
mark[i]/=x;
}
mark[1]/=x;
while (mark[mark[0]]==0) mark[0]--;
} void make_add()
{
int i,op;
if (ans[0]>0)
{
for (i=1;i<=mark[0];i++)
{
ans[i]+=mark[i];
ans[i+1]+=ans[i]/1000000;
ans[i]%=1000000;
}
while (ans[ans[0]+1]!=0)
{
ans[0]++;
ans[ans[0]+1]=ans[ans[0]]/1000000;
ans[ans[0]]%=1000000;
}
return ;
}
else
{
if (-ans[0]>mark[0]) op=-1;
else if (-ans[0]<mark[0]) op=1;
else
{
for (i=mark[0];i>=1;i--)
if (mark[i]>ans[i]) { op=1;break;}
else if (mark[i]<ans[i]) { op=-1; break;} if (i==0)
{
memset(ans,0,sizeof(ans));
ans[0]=1;
return ;
}
} if (op==1)
{
for (i=1;i<=mark[0];i++)
{
ans[i]=mark[i]-ans[i];
if (ans[i]<0)
{
mark[i+1]--;
ans[i]+=1000000;
}
}
ans[0]=-ans[0];
while (ans[ans[0]]==0) ans[0]--;
}
else
{
for (i=1;i<=-ans[0];i++)
{
ans[i]=ans[i]-mark[i];
if (ans[i]<0)
{
ans[i+1]--;
ans[i]+=1000000;
}
}
while (ans[-ans[0]]==0) ans[0]++;
} }
} void make_red()
{
int i,op;
if (ans[0]<0)
{
for (i=1;i<=mark[0];i++)
{
ans[i]+=mark[i];
ans[i+1]+=ans[i]/1000000;
ans[i]%=1000000;
}
while (ans[-ans[0]+1]!=0)
{
ans[0]--;
ans[-ans[0]+1]=ans[-ans[0]]/1000000;
ans[-ans[0]]%=1000000;
}
return ;
}
else
{
if (ans[0]>mark[0]) op=1;
else if (ans[0]<mark[0]) op=-1;
else
{
for (i=mark[0];i>=1;i--)
if (mark[i]>ans[i]) { op=-1;break;}
else if (mark[i]<ans[i]) { op=1; break;} if (i==0)
{
memset(ans,0,sizeof(ans));
ans[0]=1;
return ;
}
} if (op==1)
{
for (i=1;i<=mark[0];i++)
{
ans[i]=ans[i]-mark[i];
if (ans[i]<0)
{
ans[i+1]--;
ans[i]+=1000000;
}
}
while (ans[ans[0]]==0) ans[0]--;
}
else
{
for (i=1;i<=mark[0];i++)
{
ans[i]=mark[i]-ans[i];
if (ans[i]<0)
{
mark[i+1]--;
ans[i]+=1000000;
}
}
ans[0]=mark[0];
while (ans[ans[0]]==0) ans[0]--;
ans[0]=-ans[0];
} } }
int main()
{
int t,n,i,x,y,j,m,op;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]); memset(ans,0,sizeof(ans));
ans[0]=1;
if (i==1)
{
printf("%d\n",a[1]);
continue;
}
memset(mark,0,sizeof(mark));
mark[0]=1;
mark[1]=1;
if (n%2==1) ans[1]=a[1];
else ans[1]=-a[1];
x=1;
y=n-1;
for (i=2;i<=n;i++)
{
make_mul(y);
y--;
make_div(x);
x++;
memcpy(c,mark,sizeof(mark)); make_mul(a[i]);
if (n%2==1)
{
if (i%2==1) make_add();
else make_red();
}
else
{
if (i%2==0) make_add();
else make_red();
}
memcpy(mark,c,sizeof(c)); } if (ans[0]>0)
{
printf("%I64d",ans[ans[0]]);
for (i=ans[0]-1;i>=1;i--)
printf("%06I64d",ans[i]);
printf("\n");
}
else
{
printf("-");
printf("%I64d",ans[-ans[0]]);
for (i=-ans[0]-1;i>=1;i--)
printf("%06I64d",ans[i]);
printf("\n");
} }
return 0;
}

HDU 4927 大数的更多相关文章

  1. HDU 4927 大数运算

    模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...

  2. HDU 4927 Series 1(推理+大数)

    HDU 4927 Series 1 题目链接 题意:给定一个序列,要求不断求差值序列.直到剩一个,输出这个数字 思路:因为有高精度一步.所以要推理一下公式,事实上纸上模拟一下非常easy推出公式就是一 ...

  3. 多校第六场 HDU 4927 JAVA大数类+模拟

    HDU 4927 −ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊.如今对组合算比較什么了-- import java ...

  4. hdu 4927 java求组合数(大数)

    import java.util.Scanner; import java.math.BigInteger; public class Main { private static int [] a = ...

  5. HDU 4927 Series 1(高精度+杨辉三角)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4927 解题报告:对于n,结果如下: C(0,n-1) *A[n] - C(1,n-1) * A[n-1 ...

  6. HDU 4927

    http://acm.hdu.edu.cn/showproblem.php?pid=4927 直接模拟会超时,要在纸上写写推公式 A[n]*C(0,n-1)  - A[n-1]*C(1,n-1) + ...

  7. hdu 4927 组合+公式

    http://acm.hdu.edu.cn/showproblem.php?pid=4927 给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1−ai,直到序列长度 ...

  8. hdu 1002大数(Java)

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. hdu 5047 大数找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...

随机推荐

  1. MFC录制音频和播放音频

    一.录制音频 在windows中提供了相应的API函数(waveIn这个族的函数)实现录音功能:在使用这些函数时,一定要引入相应的头文件 #include <windows.h> #inc ...

  2. CH Round #59 - OrzCC杯NOIP模拟赛day1

    第一题:队爷的新书 题意简述:给定n个闭区间,求出一个数p使它与包含它的区间数的积最大,输出这个积. 分析:使用一个差分数组g,每个区间[l,r],l位置加1,r+1的位置减1,从前往后统计,得到对于 ...

  3. BZOJ 1083:[SCOI2005]繁忙的都市(最小生成树)

    1083: [SCOI2005]繁忙的都市 Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路 ...

  4. 【bzoj2132】圈地计划 网络流最小割

    题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...

  5. xml的并发

    网站整站的缓存方式都是依靠的DataSet的ReadXml和WriteXml的方式实现的,这种方式在访问量不是很大的网站中是一点问题都没有的(最大可承受的日IP估计在8000-15000左右),但是当 ...

  6. HTTP协议详解之消息报头

    原文地址:http://www.cnblogs.com/devinzhang/archive/2012/02/06/2340186.html HTTP消息由客户端到服务器的请求和服务器到客户端的响应组 ...

  7. springboot使用restTemplate post提交值 restTemplate post值

      post提交有 FormData和Payload  两种形式: 第一种是formdata形式,在header参数里可以直接看到  payload则封装成json格式post过去,获取以后需要再解析 ...

  8. this.$router.push() 在新窗口怎么打开

    参考:https://blog.csdn.net/qyl_0316/article/details/86550361

  9. Perm 排列计数(bzoj 2111)

    Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...

  10. 球形空间产生器sphere(bzoj 1013)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...