【大数类模板】hdoj 4927 Series 1

题目很简单:分析发现满足杨辉三角,有通项公式,但是是高精度,大数题目。

记录一个大数类模板:以后好用

代码:

#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("\n");
}
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;
}

【大数类模板】hdoj 4927 Series 1

时间: 2024-10-11 02:27:29

【大数类模板】hdoj 4927 Series 1的相关文章

大数类模板(+-*/%等等)

注意:必需先定义,再使用. #include <iostream> #include <cstring> using namespace std; #define DIGIT 4 //ËÄλ¸ô¿ª,¼´Íò½øÖÆ #define DEPTH 10000 //Íò½øÖÆ #define MAX 1000 typedef int bignum_t[MAX+1]; /*********************************************************

大数类模板

转自:http://blog.csdn.net/hackbuteer1/article/details/6595881 分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法.减法.乘法.除法.n次方.取模.大小比较.赋值以及输入流.输出流的重载.. 并且使用这个大数模板,顺利AC了HDOJ上的1134这个题目的Catalan数计数问题..http://acm.hdu.edu.cn/showproblem.php?pid=1134 大数模板的代码如下: #include<iostr

HDU 4927 Series 1(推理+大数)

HDU 4927 Series 1 题目链接 题意:给定一个序列,要求不断求差值序列,直到剩一个,输出这个数字 思路:由于有高精度一步,所以要推理一下公式,其实纸上模拟一下很容易推出公式就是一个类似杨辉三角的组合数求和,不过奇数位置是加,偶数位置是减,然后高精度过掉 代码: 本人的第一个JAVA程序^ ^ import java.util.Scanner; import java.math.BigInteger; public class Main { public static void ma

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

HDU 4927 Series 1 java大数

java mle前会wa 或者 t 这种事我会乱说? import java.math.*; import java.util.*; import java.io.*; public class Main { BigInteger[] a = new BigInteger[3007]; public void work() { int T; T = cin.nextInt(); while (T-- > 0) { int n; n = cin.nextInt(); for (int i = 0;

hdu 4927 Series 1(组合,java大数)

http://acm.hdu.edu.cn/showproblem.php?pid=4927 比赛时分分钟推出来公式后,陷入无限的tle中.起初想处理一遍,但是3000的数量内存装不下,直接编译就不过.为了不超内存,然后又试着把三个数合并为一个,四个数合并一个,100个数合并为一个,还是TLE.. 说到底还是数学不好啊,杨辉三角的第n行的第m个数为组合数c[n-1][m-1]. 应用c[n][m] = c[n][m-1]*(n-m+1)/m,就可以快速递推出第n行的数,这样就能省去预处理的时间以

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] + C(2,n-1) * A[n-2] - C(3,n-1) * A[n-3] ....... C(n-1,n-1) * A[1]; n <= 3000,到了后面二项式会很大,因为要用到高精度的乘法和除法,所以直接用java的大数类写了,简单多了. 1 import java.math.BigI

hdu 4927 Series 1

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4927 题目大意:就是把相邻的两个数想减,然后会得到一串数,然后继续想减,当还剩一个数时,问这个数是多少. 思路:开始解题时,直接模拟,结果果断WA,然后就在那儿找规律,找出来后发现是各个数的绝对值是杨辉三角(因为这个杨辉三角是正负交替出现的),有啦规律,然后就开始做题,结果还是错啦几次,然后发现是大数问题.然后又改代码,因为数组开的太大,java没过,因为当时用打表求得杨辉三角,所以一直WA,后来才

类模板的声明和使用

类模板是类的抽象,类是类模板的实例 在类模板内定义: 类模板名<实际类型名>对象名: 类模板名<实际类型名>对象名(实参表): 在类模板外定义成员函数: template<class  虚拟类型参数> 函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表){...} 如: template<class numtype> numtype Compare<numtype>::max() { return(x > y) ? x