Cod sursa(job #195367)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 18 iunie 2008 00:07:40
Problema Sarpe Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <string.h>

#define nmax 1024
#define cmax 3276
#define BAZA 10000000

int n,m,k,sol[cmax],rez[cmax],s[cmax],s1[cmax],c[cmax],s8[cmax],ss[cmax];

       void inm(int x)
{
	int i,t=0;
	for(i=1;i<=rez[0]||t;++i)
	{
		t+=rez[i]*x;
		rez[i]=t%BAZA;
		t/=BAZA;
	}
	rez[0]=i-1;
}



void mul()
{
    int i, j, t = 0;

    for (i = 1; i <= rez[0]; i++)
    {
	for (t = 0, j = 1; j <= s1[0] || t; j++, t /= BAZA)
	    c[i+j-1] = (t += c[i+j-1] + rez[i]*s1[j]) % BAZA;
        if (c[0] < i+j-2) c[0] = i+j-2;
    }
}


void inmult2()
{int i,t,la=rez[0];
 for (i=1,t=0;i<=la;++i)
     {s[i]=(rez[i]*4+t)%BAZA;
      t=(rez[i]*4+t)/BAZA;
     }
 if (t) {s[i]=t;++i;}
 s[0]=i-1;
}

void aduna()
{int i,t,la=s[0],lb=c[0];
 for (i=1,t=0;i<=la&&i<=lb;++i)
     {s8[i]=(s[i]+c[i]+t)%BAZA;
      t=(s[i]+c[i]+t)/BAZA;
     }
 for (;i<=la;++i)
     {s8[i]=(s[i]+t)%BAZA;
      t=(s[i]+t)/BAZA;
     }
 for (;i<=lb;++i)
     {s8[i]=(c[i]+t)%BAZA;
      t=(c[i]+t)/BAZA;
     }
 if (t) {s8[i]=t;++i;}
 s8[0]=i-1;
}


void inmult4()
{int i,t,la=rez[0];
 for (i=1,t=0;i<=la;++i)
     {s1[i]=(rez[i]*2+t)%BAZA;
      t=(rez[i]*2+t)/BAZA;
     }
 if (t) {s1[i]=t;++i;}
 s1[0]=i-1;
}


int main()
{
	int i,j,l;
	freopen("sarpe.in","r",stdin);
	freopen("sarpe.out","w",stdout);
	scanf("%d",&m);
	if (m==1) printf("2\n");
	rez[0]=rez[1]=1;
	inm(m);
	inmult2();
	rez[1]-=1;
	inmult4();
	rez[1]-=1;
	mul();
	aduna();
	printf("%d",s8[s8[0]]);
	for(i=s8[0]-1;i>0;--i)
		printf("%03d",s8[i]);
	printf("\n");

	return 0;
}