Cod sursa(job #605476)

Utilizator vlad2901Vlad Berindei vlad2901 Data 29 iulie 2011 13:27:36
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 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;
    rez[0] = 1;
    rezn = 1;
    for(i=0;i<pow;++i)
    {
        mult(2, rez, rezn);
    }
}

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;
    }
}