Pagini recente » Cod sursa (job #415280) | Cod sursa (job #203085) | Profil ionutz28 | Cod sursa (job #1295956) | Cod sursa (job #2332271)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("patrate2.in");
ofstream fout("patrate2.out");
int n;
unsigned long long fact[10000];
void inmultire(unsigned long long a[],unsigned long long x){
long long i,t=0;
for(i=1;i<=a[0];i++){
a[i]=a[i]*x+t;
t=a[i]/10;
a[i]%=10;
}
while(t){
a[++a[0]]=t%10;
t/=10;
}
}
int main()
{
fin>>n;
/*
5,-5 => 1
1,-1 => 0
asociez patratul
001 => 3
100 => 1
010 => 2
exista n! moduri de a aranja , n=latura patrat
toate casutele de 1 sunt n in total
se pot asocia cu -5,5 in 2^n
toate casutele de 0 sunt n^2-n = n(n-1) deci se asociaza cu 2^(n(n-1))
deci rezultatul este
n! * 2^n * 2^(n(n-1))
*/
/// n! * 2^ (n^2)
fact[0]=1;
fact[1]=1;
for(int i=2;i<=n;i++){
inmultire(fact,i);
}
n=n*n;
/// calculam 2^(n^2)
long long x=n/55;
unsigned long long y=(1LL<<55);
for(int i=1;i<=x;i++)
inmultire(fact,y);
inmultire(fact,(1LL<<(n%55)));
for(int i=fact[0];i>=1;i--)
fout<<fact[i];
}