HDU 4927 大数
题意非常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 大数的更多相关文章
- HDU 4927 大数运算
模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...
- HDU 4927 Series 1(推理+大数)
HDU 4927 Series 1 题目链接 题意:给定一个序列,要求不断求差值序列.直到剩一个,输出这个数字 思路:因为有高精度一步.所以要推理一下公式,事实上纸上模拟一下非常easy推出公式就是一 ...
- 多校第六场 HDU 4927 JAVA大数类+模拟
HDU 4927 −ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊.如今对组合算比較什么了-- import java ...
- hdu 4927 java求组合数(大数)
import java.util.Scanner; import java.math.BigInteger; public class Main { private static int [] a = ...
- 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 ...
- HDU 4927
http://acm.hdu.edu.cn/showproblem.php?pid=4927 直接模拟会超时,要在纸上写写推公式 A[n]*C(0,n-1) - A[n-1]*C(1,n-1) + ...
- hdu 4927 组合+公式
http://acm.hdu.edu.cn/showproblem.php?pid=4927 给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1−ai,直到序列长度 ...
- hdu 1002大数(Java)
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 5047 大数找规律
http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...
随机推荐
- PAT1033
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在2行中分别给出坏掉的那些键.以及应该输入的文 ...
- PAT1026
要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tick,即“时 ...
- MySql数据库 - 5.用C#连接数据库
添加 dll 引用,dll 位置:C:\Program Files (x86)\MySQL\Connector NET 8.0\Assemblies\v4.5.2 引入命名空间:MySql.Data. ...
- Gym 100989E 字符串
Description standard input/output Islam is usually in a hurry. He often types his passwords incorrec ...
- 数位DP毕业题
原题 题意 给一个 $64$ 位的二进制数,求小于这个数的回文二进制数的数量. 题解 加强版 题意 同上,但允许一个数最多有 $k$ 位不是回文(即把任意 $k$ 位取反后这个数是一个回文数),这种数 ...
- iOS添加测试设备与调试
转至:http://www.lidaze.com/ 在上一篇博客中,已经购买好了开发账号,既然都交了钱了,就做点有意义的事吧!要想使用真机测试,需要准备如下: 1.证书:安装到电脑上的cer文件, ...
- 【HDOJ5558】Alice's Classified Message(后缀数组)
题意:给定一个长度为n的下标从0开始的小写字母字符串,每次对于当前的i寻找一个j使得后缀i与后缀j的lcp最大,(j<i)若lcp相同则取较小的 若lcp为0则输出0与当前字符,i自增1,否则输 ...
- form快速转json serialize
原文发布时间为:2011-03-28 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
题目链接 题意 用\(1\times 2\)的骨牌铺满\(H\times W(H,W\leq 11)\)的网格,问方案数. 思路 参考focus_best. 竖着的骨牌用\(\begin{pmatri ...
- LeetCode OJ--Multiply Strings **
https://oj.leetcode.com/problems/multiply-strings/ 用字符串实现大数乘法,细节题,细节很多 class Solution { public: stri ...