Cod sursa(job #70528)

Utilizator a7893Nae Mihai a7893 Data 6 iulie 2007 12:23:00
Problema Patrate2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<stdio.h>
#include<string.h>
int p[100020],C[100010],fac[100010];
void mul(int A[100010], int B[100010])   
{   
      int i, j, t;   
      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 apel(int a,int b)
{
	int A[2],B[100010],k1;
	k1=1;
	p[1]=-1;
	p[0]=1;
	for(int i=0;i<100010;i++)
	{
		B[i]=0;
		C[i]=0;
	}
	A[0]=1;
	A[1]=2;
	B[0]=1;
	B[1]=1;
	for(int i=0;i<b;i++)
	{
		mul(A,B);
		for(int j=0;j<=C[0];j++)
			B[j]=C[j];
	}
}
void init(int c[100010])
{
	for(int i=0;i<100010;i++)
		c[i]=0;
}
int main()
{
	FILE *f=fopen("patrate2.in","r"),*g=fopen("patrate2.out","w");
	int a,b,c1[100010],k1=1,c2[100010],c3[100010],k3=1,i,i2;
	fscanf(f,"%d",&b);
	a=2;
	apel(a,b*b);
	for(int i1=1;i1<=C[0];i1++)
		c1[k1++]=C[i1];
	c1[0]=k1-1;
	c2[0]=1;
	c2[1]=1;
	for(i=2;i<=b;i++)
	{
		i2=i;
		while(i2)
		{
			c3[k3++]=i2%10;
			i2/=10;
		}
		c3[0]=k3-1;
		mul(c2,c3);
		memcpy(c2,C,sizeof(C));
		init(C);
		init(c3);
		k3=1;
	}
	mul(c1,c2);
	for(int i1=C[0];i1>=1;i1--)
		fprintf(g,"%d",C[i1]);
	fprintf(g,"\n");
	return 0;
}