Pagini recente » Cod sursa (job #1355009) | Cod sursa (job #546772) | Cod sursa (job #2465469) | Cod sursa (job #686058) | Cod sursa (job #1676643)
#include <fstream>
#include <cstdio>
#include <cstring>
#define nmax 215
using namespace std;
int n,v[nmax],put[nmax],sol[nmax];
int st[nmax],dr[nmax],mid[nmax];
char s[nmax];
void clearing(int k[])
{
int i;
for (i=1;i<=k[0];i++)
k[i]=0;
k[0]=0;
}
void sum(int k[],int p[])
{
int i;
for (i=1;i<=p[0];i++)
k[i]+=p[i];
k[0]=max(k[0],p[0])+1;
for (i=1;i<=k[0];i++)
if (k[i]>9) {
k[i+1]++;
k[i]-=10;
}
if (k[k[0]]==0)
k[0]--;
}
void prod(int a[],int b[])
{
int i,j;
int c[nmax]={0};
for (i=1;i<=a[0];i++)
for (j=1;j<=b[0];j++)
c[i+j-1]+=a[i]*b[j];
for (i=1;i<=100;i++)
if (c[i]>9) {
c[i+1]+=c[i]/10;
c[i]%=10;
}
c[0]=100;
while (c[c[0]]==0)
c[0]--;
for (i=0;i<=100;i++)
a[i]=c[i];
}
void putere(int put[],int mid[],int k)
{
int i,j;
int aux[nmax]={0};
for (i=0;i<=mid[0];i++)
aux[i]=mid[i];
put[0]=put[1]=1;
for (i=0;k;i++) {
if (k&(1<<i)) {
if (put[0]+aux[0]>n+5) {
put[0]=n+1;
break;
}
prod(put,aux);
k^=(1<<i);
}
if (k&&aux[0]*2>n+5) {
put[0]=n+1;
break;
}
prod(aux,aux);
}
}
void split(int a[],int k)
{
for (int i=a[0];i>=2;i--) {
a[i-1]+=(a[i]%k)*10;
a[i]/=k;
}
a[1]/=k;
if (a[a[0]]==0)
a[0]--;
}
int comparing(int a[],int b[])
{
if (a[0]<b[0])
return -1;
if (a[0]>b[0])
return 1;
int i=a[0];
while (i>=1&&a[i]==b[i])
i--;
if (i==0)
return 0;
if (a[i]>b[i])
return 1;
if (a[i]<b[i])
return -1;
}
int main()
{
int i,j,b;
freopen("numere2.in","r",stdin);
freopen("numere2.out","w",stdout);
scanf("%s",&s);
for (i=0;s[i];i++,n++)
v[i+1]=s[i]-'0';
for (i=1,j=n;i<j;i++,j--)
swap(v[i],v[j]);
v[0]=n;
for (b=33;b>=1;b--) {
clearing(st);
st[0]=st[1]=1;
clearing(dr);
dr[0]=n/b+2;
dr[n/b+2]=1;
while (comparing(st,dr)<0) {
clearing(mid);
sum(mid,st);
sum(mid,dr);
split(mid,2);
clearing(put);
putere(put,mid,b);
if (comparing(put,v)<=0) {
clearing(sol);
sum(sol,mid);
clearing(st);
st[0]=st[1]=1;
sum(st,mid);
}
else {
clearing(dr);
sum(dr,mid);
}
}
clearing(put);
putere(put,sol,b);
if (comparing(put,v)==0) {
for (i=sol[0];i>=1;i--)
printf("%d",sol[i]);
printf("\n%d\n",b);
return 0;
}
}
return 0;
}