Cod sursa(job #1055281)

Utilizator R4DIC4LTeodorescu Oana Maria R4DIC4L Data 14 decembrie 2013 11:07:34
Problema Progresie Scor 0
Compilator cpp Status done
Runda ONIS 2014, Runda 1 Marime 3.47 kb
#include <fstream>
#define NMAX 32
using namespace std;
ifstream f("progresie.in");
ofstream g("progresie.out");
class Number
{
    int m_nr[NMAX];

    public:

        Number ()
        {
            for (int i = 0; i < NMAX; ++ i)
                m_nr[i] = 0;
        }
        Number (unsigned long x)
        {
            Number();
            int pos = 0;
            while (x)
            {
                pos ++;
                m_nr[pos] = x%10;
                x /= 10;
            }
            m_nr[0] = pos;
        }
        Number (const Number& n)
        {
            Number();
            for (int i = 0; i <= n.m_nr[0]; ++ i)
            {
                m_nr[i] = n.m_nr[i];
            }
        }
        Number operator<< (int);
        Number& operator= (const Number&);
        friend Number operator+ (const Number&, int);
        friend Number operator+ (const Number&, const Number&);
        friend Number operator* (const Number&, int);
        friend Number operator* (const Number&, const Number&);
        void PrintNo();
};

Number Number::operator<<(int pos)
{
    if (pos <= 0)
        return *this;
    int n = m_nr[0];
    for (int i = n + pos; i > 0; -- i)
    {
        if (i > pos)
            m_nr[i] = m_nr[i - pos];
        else
            m_nr[i] = 0;
    }
    m_nr[0] = m_nr[0] + pos;
    return *this;
}

Number operator+ (const Number& n, int x)
{
    Number r;
    int t = 0, i;
    for (i = 1; i <= n.m_nr[0]; ++ i)
    {
        r.m_nr[i] = (n.m_nr[i] + (x != 0 ? x%10 : 0) + t)%10;
        t = (n.m_nr[i] + (x != 0 ? x%10 : 0) + t)/10;
        if (x != 0)
        {
            x /= 10;
        }
    }
    if (t != 0)
    {
        r.m_nr[i] = t;
        r.m_nr[0] = n.m_nr[0] + 1;
    }
    else
    {
        r.m_nr[0] = n.m_nr[0];
    }
    return r;
}

Number operator+ (const Number& n, const Number& p)
{
    Number r;
    int t = 0, noDigits = max(n.m_nr[0], p.m_nr[0]);
    for (int i = 1; i <= noDigits; ++ i)
    {
        r.m_nr[i] = (n.m_nr[i] + p.m_nr[i] + t)%10;
        t = (n.m_nr[i] + p.m_nr[i] + t)/10;
    }
    if (t != 0)
    {
        r.m_nr[noDigits + 1] = t;
        r.m_nr[0] = noDigits + 1;
    }
    else
    {
        r.m_nr[0] = noDigits;
    }
    return r;
}

Number operator* (const Number& n, int x)
{
    Number r;
    int t = 0, i;
    for (i = 1; i <= n.m_nr[0]; ++ i)
    {
        r.m_nr[i] = (n.m_nr[i]*x + t)%10;
        t = (n.m_nr[i]*x + t)/10;
    }
    while (t != 0)
    {
        r.m_nr[i] = t%10;
        t /= 10;
        i ++;
    }
    r.m_nr[0] = i - 1;
    return r;
}

Number operator* (const Number& n, const Number& p)
{
    Number r;
    for (int i = 1; i <= p.m_nr[0]; ++ i)
    {
        r = r + ((n * (p.m_nr[i]) ) << (i - 1) );
    }
    return r;
}

Number& Number::operator= (const Number& n)
{
    for (int i = 0; i <= n.m_nr[0]; ++ i)
        m_nr[i] = n.m_nr[i];
    return *this;
}

void Number::PrintNo()
{
    for (int i = m_nr[0]; i > 0; -- i)
    {
        g << m_nr[i];
    }
}

int main()
{
    int t;
    long long n, r;
    f >> t;
    while(t --)
    {
        f >> n >> r;
        if (n == 1)
        {
            g << 1 << "\n";
            continue;
        }
        Number len(n - 1);
        Number rat(r);
        Number k = len*rat;
        Number sol( k*(k + 1) + 1 );
        sol.PrintNo();
        g << "\n";
    }
    return 0;
}