Cod sursa(job #1830786)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 17 decembrie 2016 09:52:52
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define DIM 10005

int Factorial[DIM], Putere[DIM], Rez[DIM], N;

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

    // Calcul factorial

    scanf("%d\n", &N);

    Factorial[++Factorial[0]] = 1;

    for(int i = 2; i <= N; ++i) {
        int j = 1;
        int cat = 0;
        while(j <= Factorial[0] || cat) {
            Factorial[j] = Factorial[j] * i + cat;
            cat = Factorial[j] / 10;
            Factorial[j] %= 10;
            Factorial[0] = max(Factorial[0], j);
            ++j;
        }
    }

    Putere[++Putere[0]] = 1;

    for(int i = 1; i <= N * N; ++i) {
        int j = 1;
        int cat = 0;
        while(j <= Putere[0] || cat) {
            Putere[j] = Putere[j] * 2 + cat;
            cat = Putere[j] / 10;
            Putere[j] %= 10;
            Putere[0] = max(Putere[0], j);
            ++j;
        }
    }

    // Inmultire Putere * Factorial

    for(int j = 1; j <= Factorial[0]; ++j) {
        for(int i = 1; i <= Putere[0]; ++i) {
            Rez[i + j - 1] += Putere[i] * Factorial[j];
        }
    }

    int cat = 0;
    for(int i = 1; cat || i <= Factorial[0] + Putere[0] - 1; ++i) {
        Rez[i] += cat;
        cat = Rez[i] / 10;
        Rez[i] %= 10;
        Rez[0] = max(Rez[0], i);
    }

    for(int i = Rez[0]; i > 0; --i) {
        cout << Rez[i];
    }

    cout << '\n';

    return 0;
}