Pagini recente » Cod sursa (job #1700206) | Cod sursa (job #2463383) | Cod sursa (job #780866) | Cod sursa (job #2292890) | Cod sursa (job #1602178)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
ifstream fin("numere2.in");
ofstream fout("numere2.out");
const int base= 10;
int b;
vector <int> p, a;
int hh_comp ( vector <int> &x, vector <int> &y ) {
if ( (int)x.size()<(int)y.size() ) {
return 0;
} else if ( (int)y.size()<(int)x.size() ) {
return 1;
}
for ( int i= (int)x.size()-1; i>=0; --i ) {
if ( x[i]<y[i] ) {
return 0;
} else if ( y[i]<x[i] ) {
return 1;
}
}
return 2;
}
void h_write( vector <int> &x ) {
for ( int i= (int)x.size()-1; i>=0; --i ) {
fout<<x[i];
}
fout<<"\n";
}
void h_read ( vector <int> &x )
{
string s;
fin>>s;
for ( int i= (int)s.size()-1; i>=0; --i ) {
x.push_back(s[i]-'0');
}
}
void hh_add( vector <int> &x, vector <int> &y ) {
for ( int i= 0, t= 0; i<(int)x.size() || i<(int)y.size() || t!=0; ++i ) {
if ( i>=(int)x.size() ) {
x.push_back(0);
}
if ( i<(int)y.size() ) {
x[i]+= y[i];
}
x[i]+= t;
t= x[i]/base;
x[i]%= base;
}
}
void hh_mult( vector <int> &x, vector <int> &y ) {
vector <int> z;
z.resize( (int)x.size()+(int)y.size() );
for ( int i= 0; i<(int)x.size(); ++i ) {
int t= 0;
for ( int j= 0; j<(int)y.size() || t!=0; ++j ) {
z[i+j]+= t;
if ( j<(int)y.size() ) {
z[i+j]= z[i+j]+x[i]*y[j];
}
t= z[i+j]/base;
z[i+j]%= base;
}
}
while ( z.back()==0 && (int)z.size()>=2 ) {
z.pop_back();
}
x= z;
}
void hn_div (vector <int> &x, int y )
{
for ( int i= (int)x.size()-1; i>=1; --i ) {
x[i-1]+= x[i]%y*base;
x[i]/= y;
}
x[0]/= y;
while ( x.size()>=2 && x.back()==0 ) {
x.pop_back();
}
}
void lgput( vector <int> &x, int y ) {
vector <int> z, aux;
z.push_back(1);
for ( ; y>0; y/= 2 ) {
if ( y%2==1 ) {
hh_mult(z, x);
}
aux= x;
hh_mult(x, aux);
}
x= z;
}
int main( ) {
h_read(p);
if ( (int)p.size()==1 && p[0]==1 ) {
a.push_back(1);
b= 0;
} else {
bool ok= 0;
for ( int i= 2; i<=9 && ok==0; ++i ) {
vector <int> aux, aux2;
aux.push_back(i);
aux2= aux;
int power= 1;
while ( hh_comp(aux, p)==0 ) {
hh_mult(aux, aux2);
++power;
}
if ( hh_comp(aux, p)==2 ) {
a.push_back(i);
b= power;
ok= 1;
}
}
vector <int> p2, two;
p2.push_back(8);
two.push_back(2);
for ( int i= 100; i>=2 && ok==0; --i ) {
vector <int> aux, aux2;
aux.push_back(0);
while ( 1 ) {
vector <int> k= p2;
lgput(k, i);
if ( hh_comp(k, p)!=0 ) {
break;
}
hh_mult(p2, two);
}
for ( vector <int> step= p2; (int)step.size()!=1 || step[0]!=0; hn_div(step, 2) ) {
aux2= aux;
hh_add(aux2, step);
if ( hh_comp(aux2, p)!=1 ) {
lgput(aux2, i);
int cmp= hh_comp(aux2, p);
if ( cmp==0 || cmp==2 ) {
hh_add(aux, step);
if ( cmp==2 ) {
a= aux, b= i;
ok= 1;
}
}
}
}
}
if ( (int)a.size()==0 ) {
a= p;
b= 1;
}
}
h_write(a);
fout<<b<<"\n";
return 0;
}