Cod sursa(job #656221)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 4 ianuarie 2012 12:41:48
Problema Numere 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <stdio.h>
#include <string.h>
#define NMAX 212
#define LMAX 150
#define ll long long
char line[NMAX];
int A[NMAX],B[NMAX],act[NMAX],act2[NMAX],ncif;
inline int cif(char x)
{
	return x>='0' && x<='9';
}
void read()
{
	fgets(line+1,NMAX,stdin);
	while (cif(line[A[0]+1]))
		A[++A[0]]=line[A[0]]-'0';
	int i,t;
	for (i=1; i<=A[0]/2; i++)
		t=A[i],A[i]=A[A[0]-i+1],A[A[0]-i+1]=t;
}

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

int bigger(int poz,int nr_zero,int exp)
{
	memset(B,0,sizeof(B));
	memset(act2,0,sizeof(act2));
	act2[0]=1; act2[1]=1;
	B[0]=poz;
	int i;
	for (i=1; i<=poz; i++)
		B[poz-i+1]=act[i];
	for (i=1; i<=exp; i++)
	{
		mul(act2,B);
		if (act[0]>A[0])
			return 1;
	}
	
	if (act2[0]+nr_zero>A[0])
		return 1;
	if (act2[0]+nr_zero<A[0])
		return 0;
	for (i=1; i<=act2[0]; i++)
	{
		if (act2[act2[0]-i+1]>A[A[0]-i+1])
			return 1;
		if (act2[act2[0]-i+1]<A[A[0]-i+1])
			return 0;
	}
	return 0;
}
inline int egal(int exp)
{
	memset(B,0,sizeof(B));
	memset(act2,0,sizeof(act2));
	act2[0]=1; act2[1]=1;
	B[0]=act[0];
	int i;
	for (i=1; i<=act[0]; i++)
		B[act[0]-i+1]=act[i];
	for (i=1; i<=exp; i++)
	{
		mul(act2,B);
		if (act2[0]>A[0])
			return 0;
	}
	if (act2[0]!=A[0])
		return 0;
	for (i=1; i<=act2[0]; i++)
		if (act2[i]!=A[i])
			return 0;
	return 1;
}
int cbin(int exp)
{
	int i,step;
	ncif=(A[0]-1)/exp+1; 
	memset(act,0,sizeof(act));
	act[0]=ncif;
	for (i=1; i<=ncif; i++)
	{
		step=(1<<3);
		while (step)
		{
			if (act[i]+step<=9)
			{
				act[i]+=step;
				if ( bigger(i,(ncif-i)*exp,exp) )
					act[i]-=step;
			}
			step>>=1;
		}
	}
	if (egal(exp))
		return 1;
	return 0;
}
void solve()
{
	int i,j;
	for (i=155; i>=2; i--)
		if (cbin(i))
		{
			for (j=1; j<=act[0]; j++)
				printf("%d",act[j]);
			printf("\n%d\n",i);
			return ;
		}
	printf("%s\n1\n",line+1);
}
int main()
{
	freopen("numere2.in","r",stdin);
	freopen("numere2.out","w",stdout);
	read();
	solve();
	return 0;
}