Cod sursa(job #1813816)

Utilizator sergiudnyTritean Sergiu sergiudny Data 23 noiembrie 2016 12:49:08
Problema Patrate2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("patrate2.in");
ofstream fout("patrate2.out");
typedef int NrMare[1000];

void afis(NrMare v)
{
    int i;
    for(i=v[0];i>=1;--i)
        if(i!=v[0])
        {
            if(v[i]>999)
                fout<<v[i];
            else if(v[i]>99)
                fout<<0<<v[i];
            else if(v[i]>9)
                fout<<0<<0<<v[i];
            else
                fout<<0<<0<<0<<v[i];
        }
        else if(v[i]!=0)
            fout<<v[i];
        else
            v[0]--;
}

void produs(NrMare v, int n)
{
    int i,t=0;
    for(i=1;i<=v[0];++i,t/=10000)
    {
        t+=v[i]*n;
        v[i]=t%10000;
    }
    for(;t;t/=10000)
        v[++v[0]]=t%10000;
}
void fact(NrMare z,int n)
{
    z[0]=z[1]=1;
    for(int i=1;i<=n;++i)
        produs(z,i);

}

void produsM(NrMare a, NrMare b)
{
    int i,j,t=0;
    NrMare c;
    c[0]=a[0]+b[0]-1;
    for(i=1;i<=a[0]+b[0];++i)
        c[i]=0;
    for(i=1;i<=a[0];++i)
        for(j=1;j<=b[0];++j)
            c[i+j-1]+=a[i]*b[i];
    for(i=1;i<=c[0];++i)
    {
        t+=c[i];
        c[i]=t%10000;
        t/=10000;
    }
    if(t)
        c[++c[0]]=t;
    for(i=0;i<=c[0];i++)
        a[i]=c[i];
}
NrMare p,z;

int main()
{
    int n,i;
    fin>>n;
    p[0]=p[1]=1;
    z[0]=z[1]=1;
    for(i=1;i<=n*n;++i)
        produs(p,2);
    fact(z,n);
    produsM(p,z);
    afis(p);
    fin.close();
    fout.close();
    return 0;
}