Cod sursa(job #1612001)

Utilizator PraetorGrigorosoaia Florin Praetor Data 24 februarie 2016 17:21:14
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<fstream>
#define NRMC 20001 // numarul maxim de cifre

using namespace std;

FILE*in;
ofstream out("patrate2.out");

int N;
int DOI[NRMC];
int FACT[NRMC];
int SOL[NRMC];

void read()
{
    in=fopen("patrate2.in", "r");

    fscanf(in, "%d", &N);
}

void build_DOI()
{
    DOI[0]=1;
    DOI[1]=1;

    for (int i=1; i<=N*N; i++)
    {
        int T=0;

        for (int j=1; j<=DOI[0]; j++)
        {
            DOI[j]=DOI[j]*2+T;
            T=DOI[j]/10;
            DOI[j]=DOI[j]%10;
        }
        while (T)
        {
            DOI[0]++;
            DOI[DOI[0]]=T%10;
            T/=10;
        }
    }
}

void build_FACT()
{
    int mirror_N=N;

    while (mirror_N)
    {
        FACT[0]++;
        FACT[FACT[0]]=mirror_N%10;
        mirror_N/=10;
    }

    for (int i=1; i<N; i++)
    {
        int T=0;

        for (int j=1; j<=FACT[0]; j++)
        {
            FACT[j]=FACT[j]*i+T;
            T=FACT[j]/10;
            FACT[j]=FACT[j]%10;
        }
        while (T)
        {
            FACT[0]++;
            FACT[FACT[0]]=T%10;
            T/=10;
        }
    }
}

void build_SOL()
{
    SOL[0]=DOI[0]+FACT[0]-1;

    for (int i=1; i<=DOI[0]; i++)
        for (int j=1; j<=FACT[0]; j++)
            SOL[i+j-1]+=(DOI[i]*FACT[j]);

    int T=0;

    for (int i=1; i<=SOL[0]; i++)
    {
        SOL[i]+=T;
        T=SOL[i]/10;
        SOL[i]%=10;
    }

    if (T)
    {
        SOL[0]++;
        SOL[SOL[0]]=T;
    }
}

void solve()
{
    build_DOI();
    build_FACT();
    build_SOL();
}

void show()
{
    for (int i=SOL[0]; i>=1; i--)
        out<<SOL[i];
}

int main()
{
    read();
    solve();
    show();

    return 0;
}