Cod sursa(job #602271)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 10 iulie 2011 14:28:32
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <iostream>
#include <fstream>

using namespace std;

int Factorial[100000], N, Pow[100000];

void Multiply (int A[], int B[], int S[])
{
    int i, j, k, Aux[100000], P[100000];
    for (i=0; i<=A[0]+B[0]; ++i)
    {
        P[i]=0;
    }
    for (i=A[0]; i>0; --i)
    {
        k=1;
        for (j=B[0]; j>0; --j)
        {
            P[k+A[0]-i]+=(A[i]*B[j]);
            if (P[k+A[0]-i]>9)
            {
                P[k+A[0]+1-i]+=(P[k+A[0]-i]/10);
                P[k+A[0]-i]%=10;
            }
            ++k;
        }
    }
    i=A[0]+B[0];
    while (P[i]==0)
    {
        --i;
    }
    P[0]=i;
    for (i=1; i<=P[0]; ++i)
    {
        if (P[i]>9)
        {
            if (P[i+1]==0)
            {
                ++P[0];
            }
            P[i+1]+=(P[i]/10);
            P[i]%=10;
        }
    }
    for (i=P[0]; i>0; --i)
    {
        Aux[P[0]-i+1]=P[i];
    }
    S[0]=P[0];
    for (i=1; i<=P[0]; ++i)
    {
        S[i]=Aux[i];
    }
}

void HugePower (int N[], int P, int S[])
{
    int M[100000];
    S[0]=1;
    S[1]=1;
    for (; P; P/=2)
    {
        if (P%2==1)
        {
            Multiply (S, N, M);
            for (int i=1; i<=M[0]; ++i)
            {
                S[i]=M[i];
            }
            S[0]=M[0];
        }
        Multiply (N, N, M);
        for (int i=1; i<=M[0]; ++i)
        {
            N[i]=M[i];
        }
        N[0]=M[0];
    }
}

int main ()
{
    ifstream fin ("patrate2.in");
    ofstream fout ("patrate2.out");
    int n[100000];
    Factorial[0]=1;
    Factorial[1]=1;
    fin >> N;
    for (int i=1; i<=N; ++i)
    {
        n[0]=0;
        for (int j=i; j>0; j/=10)
        {
            ++n[0];
        }
        int k=n[0];
        for (int j=i; j>0; j/=10, --k)
        {
            n[k]=j%10;
        }
        Multiply (Factorial, n, Factorial);
    }
    n[0]=1;
    n[1]=2;
    HugePower (n, N*N, Pow);
    Multiply (Factorial, Pow, Factorial);
    for (int i=1; i<=Factorial[0]; ++i)
    {
        fout << Factorial[i];
    }
    fout << "\n";
    fin.close ();
    fout.close ();
    return 0;
}