Cod sursa(job #1309228)

Utilizator BlackBird_v.1.0Stephen Berg BlackBird_v.1.0 Data 5 ianuarie 2015 16:18:41
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>
using namespace std;
int Fact[10013],Doi[10013],n;
ifstream in("patrate2.in");
 ofstream out("patrate2.out");

void multiply(int A[],int B[])
{
 int i,j;
 int c[10013];
 memset(c,0,sizeof c);
    for (i=1;i<=A[0];++i)
      {
       int rest=0;
        for (j=1;j<=B[0] || rest; ++j, rest/=10)
          c[i+j-1]=(rest+=c[i+j-1]+A[i]*B[j])%10;
        c[0]=max(c[0],i+j-2);
	  }
 memcpy(A,c,sizeof c);
}

void power(int A[], int exp)
 {
  int aux[10013];
  aux[++aux[0]]=1;
  while(exp)
    {
     if (exp%2==0) 
       {
       	multiply(A,A);
       	exp/=2;
	   }
	 else
    if (exp%2==1)
	   {
	   	multiply(aux,A);
	   	--exp;
	   }		
	}
 memcpy(A,aux,sizeof aux);
 }

void factorial(int A[],int n)
{
 int aux,M[10013];
 for (int i=1;i<=n;++i)
   {
   	aux=i;
   	while(aux) 
	     { 
		  M[++M[0]]=aux%10; 
		  aux/=10;
		 }
   	multiply(A,M);
   	memset(M,0,sizeof M);
   }
}
int main(void)
{
 ifstream in("patrate2.in");
 ofstream out("patrate2.out");
 in>>n;
 Doi[++Doi[0]]=2;
 Fact[++Fact[0]]=1;
 power(Doi,n*n);
 factorial(Fact,n);
 multiply(Fact,Doi);
 for (int i=Fact[0];i>=1;--i) out<<Fact[i];
 return 0;
}