Cod sursa(job #797457)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 14 octombrie 2012 02:14:21
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 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()
{
    register 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, r, doilaputere;
    n2 = n*n;
    r = n2%20;
    n2 /= 20;
    doilaputere = (1<<20);
    for(i=1; i<=n2; i++)
        Inmultire(sol, doilaputere);
    for(i=1; i<=r; i++)
        Inmultire(sol, 2);

//    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;
}