Cod sursa(job #2490831)

Utilizator Robert.BrindeaBrindea Robert Robert.Brindea Data 11 noiembrie 2019 00:44:56
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("patrate2.in");
ofstream fout("patrate2.out");

class h
{
public:
    int cif[10003];
    h(){};
    h(int a)
    {
        cif[0] = 0;
        while(a)
        {
            cif[++cif[0]] = a%10;
            a/=10;
        }
    }
    void print()
    {
        for(int i = cif[0]; i >= 1; i--)
            fout << cif[i];
    }
    h operator+(h b)
    {
        h res = h(0);
        for(int i = cif[0]+1; i <= b.cif[0]; i++)
            cif[i] = 0;
        for(int i = b.cif[0]+1; i <= cif[0]; i++)
            b.cif[i] = 0;
        int mx = max(cif[0], b.cif[0]);
        cif[0] = mx;
        b.cif[0] = mx;
        int t = 0;
        for(int i = 1; i <= cif[0]; i++)
        {
            res.cif[++res.cif[0]] = cif[i] + b.cif[i] + t;
            t = res.cif[i]/10;
            res.cif[i]%=10;
        }
        while(t)
        {
            res.cif[++res.cif[0]] += t%10;
            t/=10;
        }
        return res;
    }
    h operator-(h b)
    {
        h res;
        int t = 0;
        for(int i = cif[0]+1; i <= b.cif[0]; i++)
            cif[i] = 0;
        for(int i = b.cif[0]+1; i <= cif[0]; i++)
            b.cif[i] = 0;
        int mx = max(cif[0], b.cif[0]);
        cif[0] = mx;
        b.cif[0] = mx;
        for(int i = 1; i <= cif[0]; i++)
        {
            res.cif[++res.cif[0]] = cif[i] - b.cif[i] - t;
            if(res.cif[i] < 0)
            {
                res.cif[i] += 10;
                t = 1;
            }
            else t = 0;
        }
        return res;
    }
    h operator*(h b)
    {
        h res;
        res.cif[0] = cif[0] + b.cif[0] - 1;
        for(int i = 1; i <= res.cif[0]+2;i++)
            res.cif[i] = 0;
        for(int i = 1; i <= cif[0]; i++)
        {
            for(int j = 1; j <= b.cif[0]; j++)
            {
                res.cif[i+j-1] += cif[i]*b.cif[j];
            }
        }
        int t = 0;
        for(int i = 1; i <= res.cif[0]; i++)
        {
            res.cif[i] += t;
            t = res.cif[i]/10;
            res.cif[i] %= 10;
        }
        while(t)
        {
            res.cif[++res.cif[0]] += t%10;
            t/=10;
        }
        return res;
    }
};

h ridic(h a, int p)
{
    h rez = h(1);
    h fact = a;
    for(int bit = 0; p>>bit; bit++)
    {
        if((p>>bit) & 1)
            rez = rez*fact;
        fact = fact*fact;
    }
    return rez;
}

h a = h(2), b = h(1);

int main()
{
    int n;
    fin >> n;
    a = ridic(a, n*n);
    for(int i = 2; i <= n; i++)
    {
        b = b*i;
    }
    a = a*b;
    a.print();
    return 0;
}