Cod sursa(job #354041)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 6 octombrie 2009 22:02:35
Problema Patrate2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>
using namespace std;

#define LG_MAX 10000+1
typedef int BigNumber[LG_MAX];

BigNumber fact,nr2,nr,result;
char s[LG_MAX];
int i,N;
long long rez=1;

void inmultire (BigNumber a, long 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;  
}

void produs (BigNumber a, BigNumber b, BigNumber p)  //functie inmultire nr mare*nr mare
{
     int i,t=0,cifra,j;
     for (i=0;i<LG_MAX;i++)
        p[i]=0;
     for (i=1;i<=b[0];i++)
         {
         for (t=0,j=1;j<=a[0];j++)
             {
             cifra=p[i+j-1]+a[j]*b[i]+t; // i + j - 1 pentru ca atunci cand i = 1 si j = 1 rezultatul sa fie pus in 1 + 1 - 1 = 1, adica prima pozitie
             p[i+j-1]=cifra%10;
             t=cifra/10;
             }
         if (t) p[i+j-1]=t;
         }
     for (i=LG_MAX;i>0;i--)
        if (p[i] != 0) {p[0] = i;break;}  //aici verific cate cifre are rezultatul...un numar trebuie sa inceapa cu o cifra != 0
}

void putere ()
{	
	nr[0]=nr[1]=1;
	for (i=1;i<=rez;++i)
		inmultire(nr,2);
}


void factorial ()
{
   fact[0]=fact[1]=1;
   for (i=1;i<=N;i++) 
       inmultire(fact,i);
}


int main()
{
    ifstream f("patrate2.in");
    ofstream g("patrate2.out");
    i=1;
	f>>N;
	f.close();
    factorial();
    rez=N*N;
	putere();
	/*for (i=nr[0];i>=1;--i)
		cout<<nr[i];*/
	produs(nr,fact,result);
	for (i=result[0];i>=1;--i)
		cout<<result[i];
    
    g.close();
    return 0;
}