Cod sursa(job #800317)

Utilizator NicuCJNicu B. NicuCJ Data 21 octombrie 2012 12:31:49
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda as5 Marime 1.58 kb
#include <fstream>
using namespace std;

void inmultire(int a[], int b[], int c[])
{
	int i, j, r=0;
	c[0]=a[0]+b[0]-1;
	for(i=1; i<=c[0]+1; i++)
	{
		c[i]=0;
	}
	for(i=1; i<=a[0]; i++)
	{
		for(j=1; j<=b[0]; j++)
		{
			c[i+j-1]+=a[i]*b[j];
		}
	}
	for(i=1; i<=c[0]; i++)
	{
		c[i]+=r;
		r=c[i]/10;
		c[i]%=10;
	}
	if(r)
	{
		c[0]++;
		c[c[0]]=r;
	}
}
void putere(long long b, long long n, int rez[])
{
    if(n==0)
	{
        rez[0]=1;
		rez[1]=1;
	}
    else if(n%2==0)
    {
		int a[10001];
        putere(b, n/2, a);
		inmultire(a, a, rez);
		
    }
    else
	{
        int a[10001], x[10001], ba[10001];
		ba[0]=1;
		ba[1]=2;
		putere(b, n/2, a);
		inmultire(a, a, x);
		inmultire(x, ba, rez);
	}
}
void factorial(long long n, int rez[])
{
int k[10001], a[1000];
rez[0]=1;
rez[1]=1;
int i, j;
   for(i=1; i<=n; i++)
   {
	   a[0]=rez[0];
	   int aux=i;
	   k[0]=0;
	   while(aux)
	   {
		  k[0]++;
		  k[k[0]]=aux%10;
		  aux/=10;
	   }
	   for(j=1; j<=rez[0]; j++)
	   {
		   a[j]=rez[j];
	   }
	   inmultire(a, k, rez);
   }
}
int xaxa[10001], papa[10001], rezultat[50001];
int main()
{
    ifstream cin("patrate2.in");
    ofstream cout("patrate2.out");
    long long n, p, fact;
    cin>>n;
	putere(2, n*n, xaxa);
    //la o posibilitate de aranjare a 5-urilor sunt n*n posibilitati de a pune - sau +
    //sunt n! posibilitati (permutari) de a aranja 5-urile pe fiecare rand
    factorial(n, papa);
	inmultire(papa, xaxa, rezultat);
	for(int i=rezultat[0]; i>=1; i--)
	{
		cout<<rezultat[i];
	}
   // cout<<p*fact;
}