Cod sursa(job #1780922)

Utilizator dnprxDan Pracsiu dnprx Data 16 octombrie 2016 16:47:05
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

/**
Mai intai sa completam matricea doar cu 1 si 5 astfel incat produsul
elementelor de pe fiecare linie sau coloana sa fie 5.
Observam ca pe fiecare linie si pe fiecare coloana se plaseaza
exact un 5, restul matricii fiind completata cu 1. Este evident
ca fiecare permutare a multimii (1, 2 * N) reprezinta de fapt o
posibilitate de aranjare a numarului 5 in matrice, iar de aici
deducem ca numarul de posibilitati de a completa matricea
doar cu 1 si 5 este PN (adica N!). Cum putem folosi si -1 si -5,
rezultatul final va fi 2^(N*N) * N!
*/

int a[1000000], n, k;

/// inmulteste numarul mare a[] de k cifre cu x
void Produs(int x)
{
    int y, i, tr = 0;
    for (i = 1; i <= k; ++i)
    {
        y = a[i] * x + tr;
        a[i] = y % 10;
        tr = y / 10;
    }
    while (tr > 0)
    {
        a[++k] = tr % 10;
        tr /= 10;
    }
}

void Afisare()
{
    ofstream fout("patrate2.out");
    for (int i = k; i >= 1; i--)
        fout << a[i];
    fout << "\n";
    fout.close();
}

int main()
{
    int i, N;
    ifstream fin("patrate2.in");
    fin >> n;
    fin.close();
    N = n * n;
    a[1] = 1;
    k = 1;
    while (N >= 25)
    {
        Produs(1 << 25);
        N -= 25;
    }
    if (N > 0) Produs(1 << N);
    for (i = 2; i <= n; i++)
        Produs(i);
    Afisare();
    return 0;
}