Cod sursa(job #2332271)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 30 ianuarie 2019 16:27:02
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#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];
}