Cod sursa(job #878045)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 februarie 2013 20:15:11
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <fstream>

using namespace std;

//Deschiderea fisierelor de intrare si iesire
ifstream fin("patrate2.in");
ofstream fout("patrate2.out");

#define lungime 4011

//Un numar mare
struct mare
{
    int v[lungime];
};

//Operatiile cu numere mari sunt implementate mai jos. Ele sunt explicate pe larg in rezolvarea problemei Tort
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;
}

//Exponentierea logaritmica
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);
    }
}

//Factorialul unui numar
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()
{
    //Se declara si citeste latura matricei
    int n;

    fin>>n;

    //Se declara doua numare mari f - factorial si p - putere
    mare f,p;

    //Problema se rezolva printr-o observatie matematica - numarul de metode de a completa matricea este n!*2^(n^2)
    f=factorial(n);

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

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

    //Se afiseaza raspunsul
    afis(raspuns);

    //Inchiderea fisierelor de intrare si iesire
    fin.close();
    fout.close();
    return 0;
}