Cod sursa(job #462883)

Utilizator indestructiblecont de teste indestructible Data 13 iunie 2010 21:54:04
Problema Numere 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <string.h>
#define NMAX 105
#define LMAX 155
#define ll long long
char line[NMAX];
int A[NMAX],act[LMAX];
ll rez;
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[], ll 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(ll 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(ll 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 0;
	for (i=1; i<=A[0]; i++)
		if (A[i]!=act[i])
			return 0;
	return 1;
}
int cbin(int exp)
{
	ll i,step=(1LL<<60);
	for (i=0; step; step>>=1)
		if (smaller(i+step,exp))
			i+=step;
	if (!egal(i,exp))
		return 0;
	rez=i;
	return 1;
}
void solve()
{
	int i;
	for (i=155; i>=2; i--)
		if (cbin(i))
		{
			printf("%lld\n",rez);
			printf("%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;
}