Cod sursa(job #2328977)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 26 ianuarie 2019 11:51:45
Problema Patrate2 Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <cstdio>

using namespace std;

int n;
int pn[100000], p;
int n2[100000], n22;

void inmt(int a[100000], int in, int &p)
{
    int b[100000]{0};
    for(int i=0; i<p; i++)
        b[i] = a[i];
    int pb = p;
    int indice=0;
    while(in)
    {
        int c = in%10;
        int inm=0, inma=0;
        for(int i=0; i<pb; i++)
        {
            int v = b[i]*c+inma;
            if(v>=10)
            {
                while(v>=10)
                {
                    v-=10;
                    inm++;
                }
            }
            if(indice != 0)
            {
                if(i+indice >= p)
                    p = i + indice + 1;
                a[i+indice] += v;
                if(a[i+indice] >= 10)
                {
                    a[i+indice]-=10;
                    inm++;
                }
            }
            else a[i] = v;
            inma = inm;
            inm = 0;
        }
        if(inma != 0)
        {
            while(inma != 0)
            {
                p++;
                a[p-1] = inma%10;
                inma/=10;
            }
        }
        in/=10;
        indice++;
    }
}


void fact(int n)
{
    p = 1;
    pn[0] = 1;
    for(int i=1; i<=n; i++)
        inmt(pn, i, p);
}

void inmm(int a[100000], int iin[100000], int &na, int ni)
{
    int b[100000];
    for(int i=0; i<na; i++)
        b[i] = a[i];
    int in[100000];
    for(int i=0; i<ni; i++)
        in[i] = iin[i];
    int pb = na;
    int indice=0;
    for(int i=0; i<ni; i++)
    {
        int c = in[i];
        int inm=0, inma=0;
        for(int i=0; i<pb; i++)
        {
            int v = b[i]*c+inma;
            if(v>=10)
            {
                while(v>=10)
                {
                    v-=10;
                    inm++;
                }
            }
            if(indice != 0)
            {
                if(i+indice >= na)
                    na = i + indice + 1;
                a[i+indice] += v;
                if(a[i+indice] >= 10)
                {
                    a[i+indice]-=10;
                    inm++;
                }
            }
            else a[i] = v;
            inma = inm;
            inm = 0;
        }
        if(inma != 0)
        {
            while(inma != 0)
            {
                na++;
                a[na-1] = inma%10;
                inma/=10;
            }
        }
        indice++;
    }
}




void putere(int p)
{
    n22=1;
    n2[0] = 1;
    int p2[100000];
    int c=1;
    p2[0] = 2;
    while(p > 0)
    {
        if(p%2 == 1)
        {
            p--;
            inmm(n2, p2, n22, c);
        }
        inmm(p2, p2, c, c);
        p/=2;
    }

}



int main()
{
    freopen("patrate2.in", "r", stdin);
    freopen("patrate2.out", "w", stdout);
    scanf("%d", &n);
    fact(n);
    n*=n;
    putere(n);
    inmm(pn, n2, p, n22);
    for(int i=p-1; i>=0; i--)
        printf("%d", pn[i]);

    return 0;
}