Cod sursa(job #21369)

Utilizator TabaraTabara Mihai Tabara Data 23 februarie 2007 13:22:07
Problema Patrate2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
//80 de puncte
#include <stdio.h>
#include <mem.h>
//using namespace std;

#define in "patrate2.in"
#define out "patrate2.out"
#define NMAX 101

int a[5001], b[5001], doi[5001];
int n, desc[101], ind;//maxim 17-18 cifre poate sa aiba

void Prod( int a[], int val );
void mul(int A[], int B[]);
void Conversie(int x, int b );

void Prod( int a[], int val )
{
     int i, t = 0;
     for ( i = 1; i <= a[0] || t; i++, t /= 10 )
     {
         a[i] = ( t += a[i] * val ) % 10;
     }
     a[0] = i - 1;
}

void mul(int A[], int B[])  
{  
          int i, j, t, C[10001];  
          for ( i = 0;i < 10001; ++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;  
          }  
		  for ( i = 0; i <= C[0]; ++i )
		  {
			A[i] = C[i];
		  }
}   
           
int main()
{
    freopen ( in, "r", stdin );
    freopen ( out, "w", stdout );
    int i;
    scanf( "%d", &n );
    
    Conversie( n*n, 2 );
    a[0] = 1;
    a[1] = 1;
    doi[0] = 1;
    doi[1] = 2;
    
    for ( i = ind; i >= 1; --i )
    {
            if ( desc[i] == 1)
            {
                mul( a, doi );
            }
            mul( doi, doi );
    }            
        
    b[0] = 1;
    b[1] = 1;
    for ( i = 1; i <= n; ++i )
    {
        Prod( b, i );
    }    
    //sirul b retine n!
    
    mul( a, b ); 
    //INCA NU
    
	/*for ( i = 1; i <= ind; ++i )
		printf( "%d", desc[i] );
	printf( "\n" );*/
    
    
    for ( i = a[0]; i >= 1; --i )
        printf( "%d", a[i] );
           
    return 0;
}
    
void Conversie(int x, int b)
{
    if ( x )
    {
        Conversie( x/b, b );
        desc[++ind] = x%b;
    }
}