Cod sursa(job #462876)

Utilizator indestructiblecont de teste indestructible Data 13 iunie 2010 21:16:08
Problema Numere 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#include <string.h>
#define NMAX 102
#define LMAX 150
#define ll long long
char line[NMAX];
int A[NMAX],rez,act[LMAX];
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;
	  ll t=0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += (ll)A[i] * B) % 10;
      A[0] = i - 1;
}
inline int smaller(int baza,int exp)
{
	memset(act,0,sizeof(act));
	act[0]=1; act[1]=1;
	int i;
	for (i=1; i<=exp; i++)
	{
		mul(act,baza);
		if (act[0]>100)
			return 0;
	}
	if (act[0]<A[0])
		return 1;
	if (act[0]>A[0])
		return 0;
	for (i=act[0]; i>=1; i--)
	{
		if (act[i]<A[i])
			return 1;
		if (act[i]>A[i])
			return 0;
	}
	return 1;
}
inline int egal()
{
	if (act[0]!=A[0])
		return 0;
	int i;
	for (i=1; i<=A[0]; i++)
		if (A[i]!=act[i])
			return 0;
	return 1;
}
int cbin(int exp)
{
	int i,step=(1<<30);
	for (i=0; step; step>>=1)
		if (smaller(i+step,exp))
			i+=step;
	if (!egal())
		return 0;
	rez=i;
	return 1;
}
void solve()
{
	int i;
	for (i=155; i>=2; i--)
		if (cbin(i))
		{
			printf("%d\n%d\n",rez,i);
			return ;
		}
	printf("%s\n1\n",line+1);
}
int main()
{
	freopen("numere2.in","r",stdin);
	freopen("numere2.out","w",stdout);
	read();
	solve();
	return 0;
}