Cod sursa(job #797441)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 14 octombrie 2012 01:39:00
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int n, sol[10010];

inline void Read()
{
    ifstream f("patrate2.in");
    f>>n;
    f.close();
}

inline void Inmultire(int A[], int B)
{
    int i, t = 0;
    for (i = 1; i <= A[0] || t; i++, t/=10)
    {
        A[i] = (t += A[i] * B) % 10;
    }
    A[0] = i - 1;
}

inline void Inmultire2(int A[], int B[])
{
    int i, j, t, C[10000];
    memset(C, 0, sizeof(C));
    for (i = 1; i <= A[0]; i++)
    {
            for (t=0, j=1; j <= B[0] || t; j++, t/=10)
                    C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
            if (i + j - 2 > C[0]) C[0] = i + j - 2;
    }
    memcpy(A, C, sizeof(C));
}

inline void Solve()
{
    int i;
    sol[0] = sol[1] = 1;
    for(i=1; i<=n; i++)
        Inmultire(sol, i);
    int n2 = n*n, doi[10000], putere[10000];
    memset(putere, 0, sizeof(putere));
    memset(doi, 0, sizeof(doi));
    doi[0] = 1;
    doi[1] = 2;
    putere[0] = putere[1] = 1;
    while(n2)
    {
        if (n2 % 2 == 1)
        {
            Inmultire2(putere, doi);
            n2--;
        }
        Inmultire2(doi, doi);
        n2/=2;
    }
    Inmultire2(sol,putere);
}

inline void Write()
{
    ofstream g("patrate2.out");
    int i, nsol = sol[0];
    for(i=nsol; i; i--)
        g<<sol[i];
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}