Cod sursa(job #608109)

Utilizator vlad2901Vlad Berindei vlad2901 Data 14 august 2011 23:02:13
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <stdio.h>
#define BASE 10000

int n;

void mult(int a, int v[], int &n);
void mult(int v1[], int n1, int v2[], int n2, int rez[], int &rezp);
void print(int v[], int n);
void pow2(int rez[], int &rezn, int pow);


int v1[4000], v2[4000], n1, v3[4000], n3, rez[4000], nrez;
int main()
{

    int i, j, np;
    freopen("patrate2.in", "r", stdin);
    freopen("patrate2.out", "w", stdout);

    scanf("%d", &n);

    v1[0] = 1;
    n1 = 1;

    for(i=1;i<=n;++i)
    {
        mult(i, v1, n1);
    }

    np = n*n;

    pow2(v3, n3, np);

    mult(v1, n1, v3, n3, rez, nrez);

    print(rez, nrez);

    return 0;
}

void print(int v[], int n)
{
    int i, j;
    printf("%d", v[n-1]);
    for(i=n-2;i>=0;--i)
    {
        for(j=BASE/10;j>v[i];j /= 10)
        {
            printf("0");
        }
        if(v[i])
        {
            printf("%d", v[i]);
        }
    }
}

void pow2(int rez[], int &rezn, int pow)
{
    int i, curent = 1, poz = 1, part[4000], rezpart[4000], j;
    rez[0] = 1;
    rezn = 1;
    part[0] = 2;
    int partn = 1;
    int rezpartn;

    while(pow)
    {
        if(pow %2 == 1)
        {
            for(i=curent;i<poz;++i)
            {
                mult(part, partn, part, partn, rezpart, rezpartn);
                for(j=0;j<rezpartn;++j)
                {
                    part[j] = rezpart[j];
                }
                partn = rezpartn;
            }
            curent = poz;
            mult(part, partn, rez, rezn, rezpart, rezpartn);
            for(j=0;j<rezpartn;++j)
            {
                rez[j] = rezpart[j];
            }
            rezn = rezpartn;
        }
        pow /= 2;
        poz++;

    }
}

void mult(int a, int v[], int &n)
{
    int c = 0, i, aux;
    for(i=0;i<n;++i)
    {
        aux = c;
        c = (a * v[i] + aux) / BASE;
        v[i] = (a * v[i] + aux) % BASE;
    }
    if(c)
    {
        v[i] = c;
        n++;
    }
}

void mult(int v1[], int n1, int v2[], int n2, int rez[], int &rezp)
{
    int c, i, j, aux;

    for(i=0;i<n1+n2;++i)
    {
        rez[i] = 0;
    }
    for(i=0;i<n1;++i)
    {
        c = 0;
        for(j=0;j<n2;++j)
        {
            aux = c;
            c = (rez[i+j] + v1[i] * v2[j] + aux) / BASE;
            rez[i+j] = (rez[i+j] + v1[i] * v2[j] + aux) % BASE;
        }
        rez[i+j] += c;
    }
    if(c)
    {
        rez[i+j-1] = c;
        rezp = n1 + n2;
    }
    else
    {
        rezp = n1 + n2 - 1;
    }
}