Cod sursa(job #1621487)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 29 februarie 2016 19:22:50
Problema Sarpe Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

const int base = 10000;

class big_int {
public:
    int v[705];

    big_int(int c = -1) {
        memset(v, 0, sizeof v);

        if (c != -1)
            v[0] = 1, v[1] = c;
    }

    big_int operator+(const big_int &b) const {
        big_int ans;
        ans.v[0] = max(v[0], b.v[0]);

        int tr = 0;
        for (int i = 1; i <= ans.v[0]; ++ i) {
            ans.v[i] = v[i] + b.v[i] + tr;
            tr = ans.v[i] / base;
            ans.v[i] %= base;
        }

        if (tr)
            ans.v[++ ans.v[0]] = tr;

        return ans;
    }

    big_int operator-(const big_int &b) const {
        big_int ans;
        ans.v[0] = v[0];

        int tr = 0;
        for (int i = 1; i <= ans.v[0]; ++ i) {
            ans.v[i] = v[i] - b.v[i] - tr;
            if (ans.v[i] < 0) {
                ans.v[i] += base;
                tr = 1;
            }
            else
                tr = 0;
        }

        while (ans.v[0] > 1 && !ans.v[ans.v[0]])
            -- ans.v[0];

        return ans;
    }

    big_int operator*(const big_int &b) const {
        big_int ans;
        ans.v[0] = v[0] + b.v[0];

        for (int i = 1; i <= v[0]; ++ i)
            for (int j = 1; j <= b.v[0]; ++ j)
                ans.v[i + j - 1] += v[i] * b.v[j];

        int tr = 0;
        for (int i = 1; i <= ans.v[0]; ++ i) {
            ans.v[i] += tr;
            tr = ans.v[i] / base;
            ans.v[i] %= base;
        }

        while (ans.v[0] > 1 && !ans.v[ans.v[0]])
            -- ans.v[0];

        return ans;
    }
};

istream& operator>>(istream &f, big_int &b) {
    char str[2005];
    f.get(str + 1, 2005);

    int n = strlen(str + 1);
    reverse(str + 1, str + n + 1);

    for (int i = 1; i <= n; i += 4) {
        ++ b.v[0];
        for (int j = min(n, i + 3); j >= i; -- j)
            b.v[b.v[0]] *= 10, b.v[b.v[0]] += str[j] - '0';
    }

    return f;
}

ostream& operator<<(ostream &g, const big_int &b) {
    for (int i = b.v[0]; i; -- i) {
        if (i != b.v[0]) {
            if (b.v[i] / 10 == 0)
                g << '0';
            if (b.v[i] / 100 == 0)
                g << '0';
            if (b.v[i] / 1000 == 0)
                g << '0';
        }
        g << b.v[i];
    }

    return g;
}

int main()
{
    ifstream cin("sarpe.in");
    ofstream cout("sarpe.out");

    big_int n;
    cin >> n;

    if (n.v[0] == 1 && n.v[1] == 1)
        cout << "2\n";
    else {
        big_int ans = (n * n - n + 2) * 2;
        cout << ans << '\n';
    }

    cin.close();
    cout.close();
    return 0;
}