Cod sursa(job #2399260)

Utilizator Cristi_2006Cristi Tanase Cristi_2006 Data 7 aprilie 2019 11:10:01
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

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

///N!*2^(n^2)

class Big
{
public:
    int H[5000],base=10;
    Big(uint64_t X)
    {
        H[0]=0;
        while(X)
        {
            H[++H[0]]=X%base;
            X/=base;
        }
    }
    Big(const Big& B)
    {
        H[0]=B.H[0];
        for(int i=1;i<=H[0];i++) H[i]=B.H[i];
    }
    int& operator[](int n){return H[n];}
    Big operator *(uint64_t n)
    {
        Big B=*this;
        uint64_t t=0;
        for(int i=1;i<=B.H[0];i++)
        {
            B[i]=B[i]*n+t;
            t=B[i]/base;
            B[i]=B.H[i]%base;
        }
        while(t)
        {
            B[++B[0]]=t%base;
            t/=base;
        }
        return B;
    }
    Big operator *(Big B)
    {
        int t=0;
        Big C(0);
        C.H[0]=B.H[0]+H[0]-1;
        for(int i=1;i<=H[0]+B[0];) C[i++]=0;
        for(int i=1;i<=H[0];i++)
        for(int j=1;j<=B[0];j++)
           C[i+j-1]+=H[i]*B[j];
        for (int i=1;i<=C[0];i++)
        {
            t=(C[i]+=t)/base;
            C[i]%=base;
        }
        if (t) C[++C[0]]=t;
        return C;
    }
};

Big fact(int n)
{
    if(n==0) return Big(1);
    return fact(n-1)*n;
}

Big pow(Big a,int n)
{
    Big m(1);
    if(n==0) return Big(1);
    if(n%2==0)
    {
        m=pow(a,n/2);
        return m*m;
    }
    return a*pow(a,n-1);
}

ostream& operator << (ostream&o,Big B)
{
    for(int i=B.H[0];i>=1;i--) o<<B.H[i];
    return o;
}

int main()
{
    int N; f>>N;
    g<<fact(N)*pow(Big(2),N*N);
    return 0;
}