Cod sursa(job #3240)

Utilizator gigi_becaliGigi Becali gigi_becali Data 22 decembrie 2006 16:13:39
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
// complexitate O(n^2)*(operatii numere mari)
#include <cstdio>
#include <string>
#define maxn 128
#define maxN 192

int n;
int A[maxn][maxn][maxN], fact[maxn][maxN];

void citire()
{
	freopen("race.in", "r", stdin);
	scanf("%d\n", &n);

}


void add(int A[], int B[])  
{  
      int i, t = 0;  
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)  
              A[i] = (t += A[i] + B[i]) % 10;  
      A[0] = i - 1;  
}  

void mul(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;  
}  

void mul(int A[], int B[])  
{  
      int i, j, t, C[maxN];  
      memset(C, 0, sizeof(C));  
      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;  
      }  
      memcpy(A, C, sizeof(C));  
}  


void calc_fact(int k)
{
	int i;
	fact[1][0]=1;
	fact[1][1]=1;
	for(i=2;i<=k;i++)
	{
		memcpy(fact[i], fact[i-1], sizeof(fact[i-1]));
		mul(fact[i], i);
	}
}

void dp() // Dynamic Programing :D
{
	int i, j;
	
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++) 
		{
			A[i][j][0]=0;
			if(j==1 || j==i) {A[i][j][0]=1; A[i][j][1]=1;}
			else
			{
				int x[maxN];
				memcpy(x, A[i-1][j], sizeof(A[i-1][j]));
				mul(x, j);
				add(x, A[i-1][j-1]);
				memcpy(A[i][j], x, sizeof(x));
			}
		}
}
	

int main()
{
	//citire();
	n=100;
	dp();
	calc_fact(n+1);
	int i, j, k;

	int sum[maxN];
	memset(sum, 0, sizeof(sum));
	
	for(i=1;i<=n;i++)
	{
		int x[maxN];
		memcpy(x, A[n][i], sizeof(A[n][i]));
		mul(x, fact[i]);
		add(sum, x);
	}
	
	freopen("adunare.out", "w", stdout);
	for(i=sum[0];i>0;i--) printf("%d", sum[i]);
	printf("\n");

	return 0;
}