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
原创粉丝点击