Cod sursa(job #3306738)

Utilizator Lex._.Lex Guiman Lex._. Data 13 august 2025 13:03:10
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
#define BAZA 1000000000
using namespace std;

ifstream in("patrate2.in");
ofstream out("patrate2.out");

void inmultire(vector<int>& nr, int x) ///inmulteste numarul mare nr cu x
{
    long long rest=0;
    for(int i=0; i<(int)nr.size(); i++)
    {
        rest+=(long long)nr[i]*x;
        nr[i]=rest%BAZA;
        rest=rest/BAZA;
    }
    while(rest>0)
    {
        nr.push_back(rest%BAZA);
        rest/=BAZA;
    }
}

void afisare(vector<int>& nr) ///afiseaza numarul mare nr
{
    out << nr.back();
    for(int i=nr.size()-2; i>=0; i--)
    {
        int p=BAZA;
        while(nr[i]<p/10)
        {
            p/=10;
            out << 0;
        }
        if(nr[i]!=0)
            out << nr[i];
    }
}

int main()
{
    ///vom imparti elementele in 2 categorii: cele care au modulul 1 si cele care au modulul 5
    ///fiindca produsul de pe fiecare linie sau coloana are modulul 5, fiecare linie si fiecare coloana trebuie sa aiba exact un element cu modulul 5
    ///sunt permutari de n moduri in care se pot lua aceste elemente cu modulul 5, adica n! moduri
    ///fiindca fiecare element poate fi cu + sau cu -, sunt 2^(n*n) moduri de a alege semnele
    ///asadar, sunt n! * 2^(n*n) moduri de a completa matricea

    int n;
    in >> n;
    vector<int> ans={1};

    ///calculam n!
    long long factori=1;
    for(int i=2; i<=n; i++)
    {
        if(factori*i<BAZA) ///grupam factorii
        {
            factori*=i;
        }
        else
        {
            inmultire(ans, factori);
            factori=i;
        }
    }
    inmultire(ans, factori);

    ///inmultim n! cu 2^(n*n)
    for(int i=0; i<(n*n)/30; i++) ///pentru optimizare, il inmultim pe ans cu 2^30
    {
        int putere=(1<<30); /// 2 ^ 30
        inmultire(ans, putere);
    }
    int putere=(1<<(n*n%30)); /// 2 ^ (n*n%30)
    inmultire(ans, putere);

    afisare(ans);

    return 0;
}