Cod sursa(job #812809)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 14 noiembrie 2012 15:34:06
Problema Patrate2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cassert>
#include <cstdio>
#include <cstring>

using namespace std;


const int N = 105;
const int NRC = 1500;
const int BASE = 10;

int n;
int power[NRC], fact[NRC];

void mult(int a[], int b)
{
    int i, t = 0;

    for (i = 1; i <= a[0] || t; ++i, t /= BASE)
        a[i] = (t += a[i] * b) % BASE;
    a[0] = i - 1;
}

void mult2(int a[], int b[]) {
    int i, j, t, c[NRC];
    memset(c, 0, sizeof(c));

    for (i = 1; i <= a[0]; ++i) {
        for (t = 0, j = 1; j <= b[0] || t; ++j, t/= BASE)
            c[i + j - 1] = (t += c[i + j - 1] + a[i] * b[j]) % BASE;

        if (i + j - 1 > c[0])
            c[0] = i + j - 2;
    }

    memcpy(a, c, sizeof(c));
}

void calcFact(int n)
{
    fact[0] = fact[1] = 1;
    for (int i = 2; i <= n; ++i)
        mult(fact, i);
}

void calc_power(int x, int y)
{
    power[0] = power[1] = 1;
    for (int i = 1; i <= y; ++i)
        mult(power, x);
}

void print(int a[]) {
    printf("%d", a[a[0]]);
    for (int i = a[0] - 1; i >= 1; --i)
        printf("%d", a[i]);
}

int main()
{
    assert(freopen("patrate2.in", "r", stdin) != NULL);
    assert(freopen("patrate2.out", "w", stdout) != NULL);

    assert(scanf("%d", &n) == 1);

    calcFact(n);
    calc_power(2, n * n);
    mult2(power, fact);
    
    print(power);

    return 0;
}