HDU 4927 Series 1 (大数高精度)
来源:互联网 发布:python命令行参数解析 编辑:程序博客网 时间:2024/05/16 09:51
题意就不说了。推几步就可以看出是一个杨辉三角。关键要用大数。
以前写过都是学校学的。话说没看到别人代码的时候一直认为大数的写法应该是开一个数组每一位保存0-9的数字然后模拟,事实上可以保存一个0-99,0-999,0-9999的数字,而且写法跟0-9差不多。我找了个前者模板改了好久总算改成后者了。
看来得找时间整理整理模板了
加上只推一半速度156ms还不错。
#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<cstdlib>#include<stack>#include<cmath>#include<queue>#include<set>#include<ctime>#include<string.h>#include<string>using namespace std;#define ll long long#define L 10000#define MOD 1000000007const int MAXN = 500;template <class T>inline void scan_d(T &ret) { char c; ret=0; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();}struct bign{ int len, s[MAXN]; bign (int num=0) { memset(s,0,sizeof(s)); len = 0; while(num) { s[len++] = num % L; num /= L; } } bign operator = (int num) { memset(s,0,sizeof(s)); len = 0; while(num) { s[len++] = num % L; num /= L; } return *this; } void clean() { while(len && !s[len-1]) len--; } bign operator + (const bign &b) const //+ { bign c; c.len = max(len,b.len)+1; int add = 0; for(int i = 0; i < c.len; i++) { add += s[i]+b.s[i]; c.s[i] = add%L; add /= L; } c.clean(); return c; } bign operator += (const bign &b) { *this = *this + b; return *this; } bign operator * (const bign &b) //* { bign c; c.len = len + b.len; for(int i = 0; i < len; i++) { int mul = 0; for(int j = 0; j < b.len; j++) { mul += s[i] * b.s[j]+c.s[i+j]; c.s[i+j] = mul%L; mul /= L; } if(mul) c.s[i+b.len] = mul; } c.clean(); return c; } bign operator *= (const bign &b) { *this = *this * b; return *this; } bign operator - (const bign &b) { bign c; c.len = max(len,b.len); int del = 0; for(int i = 0; i < c.len; i++) { del += s[i]-b.s[i]; c.s[i] = del; del = 0; if(c.s[i] < 0) { int tmp = (-c.s[i]-1)/L+1; c.s[i] += tmp*L; del -= tmp; } } c.clean(); return c; } bign operator -= (const bign &b) { *this = *this - b; return *this; } bign operator / (const int &b) const { bign c; c.len = len; int f = 0; for(int i = len-1; i >= 0; i--) { f = f*L+s[i]; c.s[i] = f/b; f %= b; } c.clean(); return c; } bign operator /= (const int &b) { *this = *this / b; return *this; } bool operator < (const bign &b) { if(len != b.len) return len < b.len; for(int i = len-1; i >= 0; i--) { if(s[i] != b.s[i]) return s[i] < b.s[i]; } return false; } bool operator > (const bign &b) { if(len != b.len) return len > b.len; for(int i = len-1; i >= 0; i--) { if(s[i] != b.s[i]) return s[i] > b.s[i]; } return false; } bool operator == (const bign &b) { return !(*this > b) && !(*this < b); } bool operator != (const bign &b) { return !(*this == b); } bool operator <= (const bign &b) { return *this < b || *this == b; } bool operator >= (const bign &b) { return *this > b || *this == b; } void print() { int i; printf("%d",s[len-1]); for(i = len-2; i >= 0; i--) printf("%04d",s[i]); printf("\n"); }};bign sum1,sum2;int a[3005];int n;void init(){ bign ans(1); sum1 += a[n-1]; int flag = n%2!=0?1:0; for(int i = 0; i < (n-1)/2; i++) { ans = ans*(n-i-1)/(i+1); if(i&1) { sum1 += ans*a[n-i-2]; if(flag) sum1 += ans*a[i+1]; else sum2 += ans*a[i+1]; } else { sum2 += ans*a[n-i-2]; if(flag) { if(i != (n-1)/2-1) sum2 += ans*a[i+1]; } else sum1 += ans*a[i+1]; } } if(n&1) sum1 += a[0]; else sum2 += a[0];}//void init()//{// bign ans = 1;// sum1 += a[n-1];// for(int i = 0; i < n-1; i++)// {// ans = ans*(n-i-1)/(i+1);// if(i&1) sum1 += ans*a[n-i-2];// else sum2 += ans*a[n-i-2];// }//}int main(){// freopen("input.txt","r",stdin);// freopen("o.txt","w",stdout); int tc; scanf("%d",&tc); while(tc--) { scanf("%d",&n); for(int i=0; i<n; i++) scan_d(a[i]); sum1 = 0; sum2 = 0; init(); if(sum1 >= sum2) { sum1-=sum2; sum1.print(); } else { cout<<"-"; sum2 -= sum1; sum2.print(); } } return 0;}
0 0
- HDU 4927 Series 1 (大数高精度)
- 【HDU】4927 Series 1 高精度
- hdu 4927 Series 1 高精度
- HDU 4927 Series 1 ( 组合+高精度)
- hdu 4927 Series 1 大数,排列组合
- HDU 4927 Series 1(推理+大数)
- hdu 4927 Series 1 递推+大数
- HDU 4927 Series 1 java大数
- hdu 4927 Series 1(JAVA大数)
- hdu 4927 Series 1 组合数+大数+java
- hdu 4927 Series 1(组合,java大数)
- hdu 4927 Series 1 (JAVA大数+二项式系数公式)
- hdu 4927 Series 1 (大数模板加减乘除)
- HDU 4927 Series 1(大数+杨辉三角)
- hdu4927 Series 1(组合+公式 Java大数高精度运算)
- hdu 4927 Series 1(高精度) 2014多校训练第6场
- HDU 4927 Series 1
- HDU 4927 Series 1
- UVA - 113 Power of Cryptography
- BUPT Summer Journey #test9 C
- usb 笔记
- Android系统启动过程
- hdu4502-dp
- HDU 4927 Series 1 (大数高精度)
- 【练手小程序——02】STL容器实现
- 设计包含min函数的栈
- 【BZOJ】【P3110】【ZJOI2013】【K大数查询】【题解】【树套树】
- js打印出对象的结构
- 谈谈异或加密
- BUPT Summer Journey #test9 D
- (搜索)跳棋系列2
- UVA - 10785 The Mad Numerologist