Cod sursa(job #2330003)

Utilizator cristina-criCristina cristina-cri Data 27 ianuarie 2019 19:03:42
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n;
int a[3200];
int pro[3200];
int patrat[3200];
int doi[3200];
int fnr[4];
int fact[5];
int lfact=1;
int lfnr=1;
int lpro=1;
int lpatrat=1;

struct numar
{
    int nr[3200], l;
}t[3];

void suma(int nr1[3200], int nr2[3200], int &l1, int &l2)
{
    int nm=max(l1, l2);
    int m=l1, n=l2;
    int trans=0;
    for(int i=0; i<nm; i++)
    {
        int sum=nr1[i]+nr2[i]+trans;
        trans=sum/10;
        nr1[i]=sum%10;
    }
    if(trans!=0)
        nr1[nm++]=trans;
    l1=nm;
}

void prod(int nr1[3200], int nr2[3200], int l1, int l2)
{
    //int nm=max(l1, l2);
    int nm=0;
    //int nmin=min(l1, l2);
    int trans=0;
    for(int i=0; i<l1; i++)
    {
        trans=0;
        for(int j=0; j<i; j++)
            t[2].nr[j]=0;
        for(int j=0, un=i; j<l2; j++, un++)
        {
            int pr=nr1[i]*nr2[j]+trans;
            trans=pr/10;
            t[2].nr[un]=pr%10;
        }
        nm=l2+i;
        if(trans)
            t[2].nr[nm++]=trans;
        t[2].l=nm;
        suma(t[1].nr, t[2].nr, t[1].l, t[2].l);
    }

}

void copiere(int a[3200], int b[3200], int &la, int &lb)
{
    la=lb;
    for(int i=0; i<lb; i++)
        a[i]=b[i];
}

void zero(int a[3200], int &l)
{
    for(int i=0; i<l; i++)
        a[i]=0;
    l=0;
}

int rez[3200], l;

void put(int a[3200], int p, int &nra)
{
    rez[0]=1;
    l=1;
    while(p!=0)
    {
        if(p%2 ==1)
        {
            p--;
            prod(rez, a, l, nra);
            copiere(rez, t[1].nr, l, t[1].l);
            zero(t[1].nr, t[1].l);
        }
        p/=2;
        prod(a, a, nra, nra);
        copiere(a, t[1].nr, nra, t[1].l);
        zero(t[1].nr, t[1].l);
    }
}


int main()
{

    freopen("patrate2.in", "r", stdin);
    freopen("patrate2.out", "w", stdout);

    scanf("%d", &n);
    int nr=0;
    int aux=n;
    while(aux)
    {
        a[nr++]=aux%10;
        aux/=10;
    }
    fnr[0]=1;
    pro[0]=1;
    for(int i=1; i<=n; i++)
    {
        suma(fact, fnr, lfact, lfnr);
        prod(pro, fact, lpro, lfact);
        copiere(pro, t[1].nr, lpro, t[1].l);
        zero(t[1].nr, t[1].l);
    }
    //for(int i=0; i<lpro; i++)
        //printf("%d", pro[i]);
    //printf("\n");
    //prod(a, a, nr, nr);
    //copiere(patrat, t[1].nr, lpatrat, t[1].l);
    int npatr=n*n;
    int ldoi=1;
    doi[0]=2;
    put(doi, npatr, ldoi);
    prod(rez, pro, l, lpro);
    copiere(pro, t[1].nr, lpro, t[1].l);
    for(int i=lpro-1; i>=0; i--)
        printf("%d", pro[i]);
    return 0;
}