Cod sursa(job #1889524)

Utilizator cipri321Marin Ciprian cipri321 Data 22 februarie 2017 19:18:34
Problema Patrate2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>

using namespace std;
ifstream fi("patrate2.in");
ofstream fo("patrate2.out");
int n,i,cn;
int R[10000],X[10000];
void copiaza(int A[],int B[])
{
    A[0]=B[0];
    for(int i=1; i<=B[0]; i++)
        A[i]=B[i];
}
void multvect(int A[],int B[],int C[])
{
    int i,j,T=0;
    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[j];
    for (i=1; i<=C[0]; i++)
    {
        T=(C[i]+=T)/10;
        C[i]%=10;
    }
    if (T) C[++C[0]]=T;
}
void mult(int A[],int x)
{
    int i,p,t=0;
    for(i=1;i<=A[0];i++)
    {
        p=A[i]*x+t;
        A[i]=p%10;
        t=p/10;
    }
    while(t)
    {
        A[++A[0]]=t%10;
        t/=10;
    }
}
int main()
{
    fi>>n;
    cn=n*n;
    R[0]=1;
    R[1]=2;
    while(true)
    {
        if(cn==1)
            break;
        if(cn%2==0)
        {
            cn/=2;
            multvect(R,R,X);
            copiaza(R,X);
        }
        else
        {
            cn--;
            mult(R,2);
        }
    }
    for(i=1; i<=n; i++)
        mult(R,i);
    for(i=R[0]; i>=1; i--)
        fo<<R[i];
    fi.close();
    fo.close();
    return 0;
}