Cod sursa(job #1799929)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 7 noiembrie 2016 00:35:57
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include<fstream>
#include<cmath>
typedef int Huge[100000];
using namespace std;
ifstream f("patrate2.in");
ofstream g("patrate2.out");
int n,i;
Huge A,B,C;
void formare(Huge A,int x)
{
    while(x)
    {
        int u=x%10;
        A[0]++;
        A[A[0]]=u;
        x/=10;
    }
}
void inmultire(Huge A,int n)
{
    int tr=0,i;
    for(i=1; i<=A[0]; i++)
    {
        A[i]=(A[i]*n+tr);
        tr=A[i]/10;
        A[i]=A[i]%10;
    }
    while(tr)
    {
        A[++A[0]]=tr%10;
        tr/=10;
    }
}
void ridicare(Huge A,int n)
{
    while(n)
    {
        inmultire(A,2);
        n--;
    }
}
void fact(int n)
{
    formare(B,1);
    int k=2;
    while(k<=n)
    {
        inmultire(B,k);
        k++;
    }
}
void Mult(Huge A, Huge B, Huge C)
/* C <- A x B */
{
    int 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;
}
int main()
{
    f>>n;
    formare(A,1);
    ridicare(A,n*n);
    fact(n);
    Mult(A,B,C);
    //g<<pow(2,n*n)*fact(n);
    for(i=C[0];i>=1;i--)
        g<<C[i];
}