Cod sursa(job #1773749)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 8 octombrie 2016 10:31:23
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<fstream>
using namespace std;
ifstream fi("patrate2.in");
ofstream fo("patrate2.out");
long long A[100001],B[100001],C[100001];
long long n,i,p;

void inm(long long x)
{
    long long i,t=0LL;
    for(i=1; i<=A[0]; i++)
    {
        A[i]=A[i]*x+t;
        t=A[i]/10;
        A[i]=A[i]%10;
    }
    while(t)
    {
        A[++A[0]]=t%10;
        t/=10;
    }
}

void inm2()
{
    long long i,j,t=0;
    C[0]=B[0]+B[0]-1;
    for(i=1;i<=B[0]+B[0];)
        C[i++]=0;
    for(i=1;i<=B[0];i++)
        for(j=1;j<=B[0];j++)
            C[i+j-1]+=B[i]*B[j];
    for(i=1;i<=C[0];i++)
    {
        t=(C[i]+=t)/10;
        C[i]%=10;
    }
    if(t)
        C[++C[0]]=t;
    for(i=0; i<=C[0]; i++)
        B[i]=C[i];
}

void inmv()
{
    long long i,j,t=0;
    C[0]=A[0]+B[0]-1;
    for(i=1;i<=A[0]+B[0];)
        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;
    for(i=0; i<=C[0]; i++)
        A[i]=C[i];
}

int main()
{
    fi>>n;
    A[0]=A[1]=1;
    for(i=1; i<=n; i++)
    {
        inm(i);
    }
    p=n*n;
    B[0]=1;
    B[1]=2;
    for(i=0; (1<<i)<=p; i++)
    {
        if (((1<<i)&p)>0)
            inmv();
        inm2();
    }
    for(i=A[0]; i>=1; i--)
        fo<<A[i];
    fo<<"\n";
    fi.close();
    fo.close();
    return 0;
}