Cod sursa(job #1857006)

Utilizator Coroian_DavidCoroian David Coroian_David Data 25 ianuarie 2017 18:25:05
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
///fiecare nuamr poate avea -
///pentru fiecare conficugratie valida genram comb(n*n, 0) + comb(n * n, 1)..., comb(n * n, n * n);

///nr conf valide: -(n) * (n - 1)- : n!;
///exceptie 1 : 2
/**
2
1 5
5 1

5 1
1 5

1
5

3
1 1 5
1 5 1
5 1 1

1 1 5
5 1 1
1 5 1


1 5 1
5 1 1
1 1 5

1 5 1
5 1 1
1 1 5


5 1 1
1 5 1
1 1 5

5 1 1
1 1 5
1 5 1

4
5 1 1 1
1 5 1 1
1 1 5 1
1 1 1 5

5 1 1 1
1 1 5 1
1 5 1 1
1 1 1 5

5 1 1 1
1 1 5 1
1 1 1 5
1 5 1 1
**/

#include <cstdio>

using namespace std;

FILE *f, *g;

int n;

int rez[40000];


void readFile()
{
    f = fopen("patrate2.in", "r");

    fscanf(f, "%d", &n);

    fclose(f);
}

inline int mxa(int a, int b)
{
    return (a > b ? a : b);
}

void aduna(int c[], int a[], int b[])
{
    int i, j;
    int mx = mxa(a[0], b[0]);
    int t = 0;

    for(i = 1; i <= mx || (t > 0); i ++)
    {
        t = a[i] + b[i] + t;

        c[i] = t % 10;

        t /= 10;
    }

    c[0] = i - 1;
}

void inmultesteScalar(int a[], int nr)
{
    int t = 0;
    int i;

    for(i = 1; i <= a[0] || (t > 0); i ++)
    {
        t = a[i] * nr + t;

        a[i] = t % 10;

        t /= 10;
    }

    a[0] = i - 1;
}

void copyV(int a[], int b[])
{
    int i, j;

    for(i = 0; i <= b[0]; i ++)
    {
        a[i] = b[i];
    }
}
/*
void getComb()
{
    int i, j;

    comb[2][1][0] = comb[2][1][1] = 1;
    comb[2][0][0] = comb[2][0][1] = 1;

    int n2 = n * n;

    for(i = 2; i <= n2; i ++)
    {
        for(j = 0; j <= i; j ++)
        {
            if(j == 0 || (i == j))
            {
                comb[1][j][0] = comb[1][j][1] = 1;
            }

            else
            {
                aduna(comb[1][j], comb[2][j - 1], comb[2][j]);
            }
        }

        for(j = 0; j <= i; j ++)
        {
            copyV(comb[2][j], comb[1][j]);
        }
    }
}
*/
void scrie(int rez[])
{
    int i;

    for(i = rez[0]; i >= 1; i --)
        printf("%d", rez[i]);

    printf("\n");
}

void solve()
{
    if(n == 1)
        rez[0] = 1, rez[1] = 2;

    else
    {
        rez[0] = rez[1] = 1;

        int n2 = n * n;

        int i;
        for(i = 1; i <= n2; i ++)
            inmultesteScalar(rez, 2);//, scrie(comb[1][i]);

        for(i = 2; i <= n; i ++)
            inmultesteScalar(rez, i);
    }
}

void printFile()
{
    g = fopen("patrate2.out", "w");

    int i;
    for(i = rez[0]; i >= 1; i --)
    {
        fprintf(g, "%d", rez[i]);
    }

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}