Pagini recente » Cod sursa (job #1397872) | Cod sursa (job #1912174) | Cod sursa (job #1000422) | Diferente pentru runda/blaga_programming_contest intre reviziile 1 si 3 | Cod sursa (job #3306738)
#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;
}