Cod sursa(job #2278041)

Utilizator LivcristiTerebes Liviu Livcristi Data 7 noiembrie 2018 10:40:52
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define NUM 5000
using namespace std;
ifstream f("patrate2.in");
ofstream g("patrate2.out");
int n;
struct Huge
{
    int v[NUM];
    Huge(int num)
    {
        v[0] = 0;
        do
        {
            v[++v[0]] = num % 10;
            num /= 10;
        }
        while(num);
    }
    Huge(char * s)
    {
        for(int i = 0; i < NUM; ++i)
            v[i] = 0;
        int lng = strlen(s);
        for(int i = lng - 1, j = 1; i >= 0; --i)
            v[j] = s[i] - '0';
        v[0] = lng;
    }
    void afis()
    {
        for(int i = v[0]; i >= 1; --i)
            g << v[i];
        g << "\n";
    }
    void copie(Huge a)
    {
        for(int i = a.v[0]; i >= 0; --i)
            v[i] = a.v[i];
    }
};
void add(Huge & a, Huge b)
{
    int i, t = 0;

    if (b.v[0] > a.v[0])
    {
        for (i = a.v[0] + 1; i <= b.v[0];)
            a.v[i++]=0;
        a.v[0] = b.v[0];
    }
    else
        for (i = b.v[0] + 1; i <= a.v[0];)
            b.v[i++]=0;

    for(i = 1; i <= a.v[0]; i++, t /= 10)
    {
        t += a.v[i] + b.v[i];
        a.v[i] = t % 10;
    }
    if(t)
        a.v[++a.v[0]] = t;
}
void mult(Huge & A, Huge B)
{
    int i,j, T = 0;
    Huge C(0);
    C.v[0] = A.v[0] + B.v[0] - 1;
    for (i = 1; i <= A.v[0] + B.v[0];)
        C.v[i++] = 0;
    for (i = 1; i <= A.v[0]; i++)
        for (j = 1; j <= B.v[0]; j++)
            C.v[i + j - 1] += A.v[i] * B.v[j];
    for (i = 1; i <= C.v[0]; i++)
    {
        T = (C.v[i] += T) / 10;
        C.v[i] %= 10;
    }
    if (T)
        C.v[++C.v[0]] = T;
    for(i = 0; i <= C.v[0]; ++i)
        A.v[i] = C.v[i];
}
int put(int a, int b)
{
    int rez = 1;
    for(int i = 1; i <= b; ++i)
        rez *= a;
    return rez;
}
void puth(Huge & a, int put)
{
    Huge rez(1);
    while(put)
    {
        if(put & 1)
            mult(rez, a);
        put = put >> 1;
        mult(a, a);
    }
    a.copie(rez);
}

int main()
{
    f >> n;
    Huge rasp(1);
    Huge aux(2);
    for(int i = 2; i <= n; ++i)
        mult(rasp, i);
    puth(aux, n * n);
    mult(rasp, aux);
    rasp.afis();
    f.close();
    g.close();
}