Cod sursa(job #797450)

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

using namespace std;

int n, sol[5000];

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[5000];
    for(i=0; i<5000; i++)
        C[i] = 0;
    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;
    }
    int nc;
    nc = C[0];
    for(i=0; i<=nc; i++)
        A[i] = C[i];
}

inline void Write()
{
    freopen("patrate2.out", "w", stdout);
    int i, nsol = sol[0];
    for(i=nsol; i; i--)
        printf("%d", sol[i]);
    printf("\n");
}

inline void Solve()
{
    int i;
    if (n==1)
    {
        ofstream g("patrate2.out");
        g<<"2\n";
        g.close();
        return ;
    }
    sol[0] = sol[1] = 1;
    for(i=2; i<=n; i++)
        Inmultire(sol, i);
    int n2 = n*n, doi[5000], putere[5000];
    for(register int j = 0; j<5000; j++)
        doi[j] = putere[j] = 0;
    doi[0] = 1;
    doi[1] = 2;
    putere[0] = putere[1] = 1;
    while(n2)
    {
        if (n2 & 1)
        {
            Inmultire2(putere, doi);
            n2--;
        }
        Inmultire2(doi, doi);
        n2 >>= 1;
    }
    Inmultire2(sol,putere);
    Write();
}

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