[대수형 템플릿] hdoj 4927 시리즈 1

6057 단어
문제는 매우 간단하다. 양휘삼각형을 만족시키는 것을 분석한 결과 통항 공식이 있지만 고정밀, 대수 문제이다.
큰 종류의 템플릿을 기록합니다: 나중에 사용하기 좋습니다
코드:
#include<cstdio>
#include<cstring>
using namespace std;

#define MAXN 9999
#define MAXSIZE 10
#define DLEN 4

class BigInt
{
private:
    int a[500];
    int len;
public:
    BigInt() {len = 1; memset(a, 0, sizeof(a));}
    BigInt(const int);
    BigInt(const char *);
    BigInt(const BigInt &);
    BigInt &operator = (const BigInt &);

    BigInt operator + (const BigInt &) const;
    BigInt operator - (const BigInt &) const;
    BigInt operator * (const BigInt &) const;
    BigInt operator / (const int &) const;

    bool operator > (const BigInt &T) const;
    bool operator < (const BigInt &T) const;
    bool operator == (const BigInt &T) const;
    bool operator > (const int &t) const;
    bool operator < (const int &t) const;
    bool operator == (const int &t) const;
    void print();
};

bool BigInt::operator == (const BigInt &T) const {
    return !(*this > T) && !(T > *this);
}
bool BigInt::operator == (const int &t) const {
    BigInt T = BigInt(t);
    return *this == T;
}
bool BigInt::operator < (const BigInt &T) const {
    return T > *this;
}
bool BigInt::operator < (const int &t) const {
    return BigInt(t) > *this;
}
BigInt::BigInt(const int b) {
    int c, d = b;
    len = 0;
    memset(a, 0, sizeof(a));
    while(d > MAXN) {
        c = d - (d / (MAXN + 1)) * (MAXN + 1);
        d = d / (MAXN + 1);
        a[len++] = c;
    }
    a[len++] = d;
}
BigInt::BigInt(const char *s) {
    int t, k, index, l, i;
    memset(a, 0, sizeof(a));
    l = strlen(s);
    len = l / DLEN;
    if(l % DLEN)
        len++;
    index = 0;
    for(i = l - 1; i >= 0; i -= DLEN)
    {
        t = 0;
        k = i - DLEN + 1;
        if(k < 0)
            k = 0;
        for(int j = k;j <= i; j++)
            t = t * 10 + s[j] - '0';
        a[index++] = t;
    }
}
BigInt::BigInt(const BigInt &T) : len(T.len)
{
    int i;
    memset(a, 0, sizeof(a));
    for(i = 0; i < len; i++)
        a[i] = T.a[i];
}
BigInt & BigInt::operator = (const BigInt &n)
{
    int i;
    len = n.len;
    memset(a, 0, sizeof(a));
    for(i = 0; i  < len; i++)
        a[i] = n.a[i];
    return *this;
}
BigInt BigInt::operator + (const BigInt &T) const{
    BigInt t(*this);
    int i, big;
    big = T.len > len ? T.len : len;
    for(int i = 0; i < big; i++)
    {
        t.a[i] += T.a[i];
        if(t.a[i] > MAXN)
        {
            t.a[i+1]++;
            t.a[i] -= MAXN + 1;
        }
    }
        if(t.a[big] != 0)
            t.len = big + 1;
        else
            t.len = big;
        return t;
}
BigInt BigInt::operator - (const BigInt &T) const {
    int i, j, big;
    bool flag;
    BigInt t1, t2;
    if(*this > T)
    {
        t1 = *this;
        t2 = T;
        flag = 0;
    }
    else
    {
        t1 = T;
        t2 = *this;
        flag = 1;
    }
    big = t1.len;
    for(i = 0; i < big; i++)
    {
        if(t1.a[i] < t2.a[i])
        {
            j = i + 1;
            while(t1.a[j] == 0)
                j++;
            t1.a[j--]--;
            while(j > i)
                t1.a[j--] += MAXN;
            t1.a[i] +=  MAXN + 1 - t2.a[i];
        }
        else
            t1.a[i] -= t2.a[i];
    }
    t1.len = big;
    while(t1.a[t1.len - 1] == 0 && t1.len > 1)
    {
        t1.len--;
        big--;
    }
    if(flag)
        t1.a[big-1] = 0 - t1.a[big-1];
    return t1;
}
BigInt BigInt::operator * (const BigInt &T) const {
    BigInt ret;
    int i, j, up;
    int tmp, temp;
    for(i = 0; i < len; i++)
    {
        up = 0;
        for(j = 0; j < T.len; j++)
        {
            temp = a[i] * T.a[j] + ret.a[i+j] + up;
            if(temp > MAXN)
            {
                tmp = temp - temp / (MAXN + 1) * (MAXN + 1);
                up = temp / (MAXN + 1);
                ret.a[i + j] = tmp;
            }
            else
            {
                up = 0;
                ret.a[i + j] = temp;
            }
        }
        if(up != 0)
            ret.a[i + j] = up;
    }
    ret.len = i + j;
    while(ret.a[ret.len - 1] == 0 && ret.len > 1)
        ret.len--;
    return ret;
}
BigInt BigInt::operator / (const int &b) const {
    BigInt ret;
    int i, down = 0;
    for(i = len - 1; i >= 0; i--)
    {
        ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
        down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
    }
    ret.len = len;
    while(ret.a[ret.len - 1] == 0 && ret.len > 1)
        ret.len--;
    return ret;
}
bool BigInt::operator > (const BigInt &T) const {
    int ln;
    if(len > T.len)
        return true;
    else if(len == T.len)
    {
        ln = len - 1;
        while(a[ln] == T.a[ln] && ln >= 0)
            ln--;
        if(ln >= 0 && a[ln] > T.a[ln])
            return true;
        else
            return false;
    }
    else
        return false;
}
bool BigInt::operator > (const int &t) const {
    BigInt b(t);
    return *this > b;
}
void BigInt::print()
{
    printf("%d",a[len-1]);
    for(int i = len - 2; i >= 0; i--)
        printf("%04d", a[i]);
    printf("
"); } int main() { int n, T, i, j, a[3005]; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1; i <= n; i++) scanf("%d",&a[i]); BigInt positive(0), negative(0), C(1), tmp; for(i = 0; i <= n - 1; i++) { if(i > 0) C = (C * (BigInt)(n - i)) / i; tmp = C * (BigInt)(a[n-i]); if(i&1) negative = negative + tmp; else positive = positive + tmp; } BigInt ans = positive - negative; ans.print(); } return 0; }

좋은 웹페이지 즐겨찾기