Cod sursa(job #874511)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 8 februarie 2013 18:10:49
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>

using namespace std;

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

#define lungime 4011

struct mare
{
    int v[lungime];
};

void init(mare &a)
{
    int i;

    for(i=0;i<lungime;i++)
        a.v[i]=0;
}

mare produs(mare &a,mare &b)
{
    mare aux;
    init(aux);

    aux.v[0]=a.v[0]+b.v[0];

    int i,j;

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

    for(i=1;i<=aux.v[0];i++)
    {
        aux.v[i+1]+=(aux.v[i]/10);
        aux.v[i]%=10;
    }

    while(aux.v[aux.v[0]]==0)
        aux.v[0]--;

    return aux;
}

mare produs(mare &a,int n)
{
    mare aux;
    init(aux);

    aux.v[0]=a.v[0];

    int i;
    for(i=1;i<=aux.v[0];i++)
    {
        aux.v[i]=a.v[i]*n;
    }

    for(i=1;i<=aux.v[0];i++)
    {
        aux.v[i+1]+=(aux.v[i]/10);
        aux.v[i]%=10;
    }

    while(aux.v[aux.v[0]+1]!=0)
    {
        aux.v[0]++;
        aux.v[aux.v[0]+1]+=aux.v[aux.v[0]]/10;
        aux.v[aux.v[0]]%=10;
    }

    return aux;
}

void afis(mare &a)
{
    int i;
    for(i=a.v[0];i>=1;i--)
    {
        fout<<a.v[i];
    }

    fout<<'\n';
}

mare int_to_mare(int x)
{
    mare aux;
    init(aux);

    while(x>0)
    {
        aux.v[++aux.v[0]]=x%10;
        x/=10;
    }

    return aux;
}

mare putere(int baza,int exp)
{
    if(exp==0)
    {
        mare aux;
        init(aux);
        aux.v[0]=1;
        aux.v[1]=1;

        return aux;
    }
    else if(exp==1)
    {
        return int_to_mare(baza);
    }
    else if(exp%2==0)
    {
        mare aux;
        init(aux);

        aux=putere(baza,exp/2);
        return produs(aux,aux);

    }
    else
    {
        mare aux;
        init(aux);

        aux=putere(baza,exp-1);

        return produs(aux,baza);
    }
}

mare factorial(int x)
{
    mare aux;
    init(aux);
    aux.v[0]=1;
    aux.v[1]=1;

    int i;
    for(i=2;i<=x;i++)
    {
        aux=produs(aux,i);
    }
    return aux;
}

int main()
{
    int n;
    fin>>n;
    /*
    mare x;
    x.v[0]=4;
    x.v[1]=9;
    x.v[2]=0;
    x.v[3]=3;
    x.v[4]=4;
    int a=15921;
    mare p;
    init(p);
    p=produs(x,a);
    afis(p);*/
    mare f,p;

    //init(f);
    f=factorial(n);
    //afis(f);

    init(p);
    n*=n;
    p=putere(2,n);

    //afis(p);

    mare raspuns;
    init(raspuns);
    raspuns=produs(f,p);

    afis(raspuns);
fin.close();
fout.close();
    return 0;
}