题意非常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. Box 类

    public class Box extends JComponent implements Accessible使用 BoxLayout 对象作为其布局管理器的一个轻量级容器.Box 提供几个对使用 ...

  2. Vue2.0 - 自定义指令 vue-directive

    Vue.directive('指令',function(el,binding,vnode){ el.style='color:'+binding.value;}); el : 指令所绑定的元素,可以用 ...

  3. hibernate运行常见错误

    错误一: Exception in thread "main" org.hibernate.MappingException: Could not determine type f ...

  4. AGC 26 F Manju Game

    $\DeclareMathOperator{\sw}{sw}$ $\DeclareMathOperator{\sb}{sb}$ $\DeclareMathOperator{\dp}{dp}$ 用 $\ ...

  5. 秀秀的照片(photo)

    秀秀的照片(photo) 题目描述 华华在和秀秀视频时有截很多图.华华发现秀秀的每一张照片都很萌很可爱.为什么会这样呢?华华在仔细看过秀秀的所有照片后,发现秀秀的照片都具有一个相同的性质. 设秀秀的分 ...

  6. php中的对象赋值

    如果现在问你一个问题: <?php class A{ public $a = 1; } $a = new A(); $b = $a; $b->a = 3; print_r($a->a ...

  7. Unity使用 16bit 压缩 Texture 颜色能均匀过渡

    下面是unity自带 16bit 图 的效果,可以看到颜色过度的很不均匀,占用内存 0.5M    如果调成 truecolor 后 颜色过渡很均匀,而内存却占到 1.1 M    讲图片 后缀名改成 ...

  8. canvas游戏开发系列(1):基础知识

    canvas基础知识 canvas是什么? canvas是html5的一个元素,可以说他的功能是html元素中最强大的一个. 举个栗子: 第一步:在页面中引入canvas标签,并且设置好宽高背景等样式 ...

  9. hdu 1158 dp

    /* 题目大意:给n个月工作需要的人数,雇佣一个需要花hire 每个月的薪水是salary,解雇一个需要fire 求完成所有工作的最小费用 dp(i,j)表示第i个月雇佣j员工的最小费用 */ #in ...

  10. 【HDOJ5520】Number Link(费用流)

    题意:NxM的格子有些上面有数字,现在要把奇数跟偶数配对连起来,其他的格子连成一个个回路, 单独的相邻两个格子相连也算是一个回路按两条边算,连线不能相交, 给出相邻两个格子相连的费用,求最小的总费用, ...