Pagini recente » Cod sursa (job #2621922) | Cod sursa (job #1406859) | Cod sursa (job #2863006) | Cod sursa (job #2625088) | Cod sursa (job #2705517)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin ("numere2.in");
ofstream cout ("numere2.out");
struct Number {
short nr, a[405];
Number() {
memset(a, 0, sizeof(a));
nr = 0;
}
Number(int number) {
memset(a, 0, sizeof(a));
nr = 0;
while(number)
a[++nr] = number % 10, number /= 10;
}
bool operator == (const Number &other) const {
if(nr != other.nr)
return false;
for(int i = 1; i <= nr; i++) {
if(a[i] != other.a[i])
return false;
}
return true;
}
bool operator <= (const Number &other) const {
if(nr < other.nr)
return true;
if(nr > other.nr)
return false;
for(int i = nr; i >= 1; i--) {
if(a[i] < other.a[i])
return true;
if(a[i] > other.a[i])
return false;
}
return true;
}
Number operator + (const Number &other) const {
short t = 0, i;
Number ans = Number();
for(i = 1; i <= nr || i <= other.nr || t; i++, t /= 10)
ans.a[i] = (t += a[i] + other.a[i]) % 10;
ans.nr = i - 1;
return ans;
}
Number operator * (const Number &other) const {
Number ans = Number();
for(int i = 1; i <= nr; i++) {
short t, j;
for(t = 0, j = 1; j <= other.nr || t; j++, t /= 10)
ans.a[i + j - 1] = (t += ans.a[i + j - 1] + a[i] * other.a[j]) % 10;
if(i + j - 2 > ans.nr) {
ans.nr = i + j - 2;
if(ans.nr > 100)
return ans;
}
}
return ans;
}
Number operator * (int number) const {
Number ans = Number();
short t = 0, i;
if(number == 0)
return ans;
for(i = 1; i <= nr || t; i++, t /= 10) {
ans.a[i] = (t += number * a[i]) % 10;
if(i > 101) {
ans.nr = i - 1;
return ans;
}
}
return ans;
}
Number operator / (int number) const {
Number ans = Number();
short t = 0, i;
ans.nr = nr;
for(i = nr; i >= 1; i--, t %= number)
ans.a[i] = (t = t * 10 + a[i]) / number;
while(!ans.a[ans.nr] && ans.nr > 1)
ans.nr--;
return ans;
}
Number operator - (const Number &other) const {
short i, t = 0;
Number tmp = Number();
for(i = 1; i <= nr; i++) {
tmp.a[i] = a[i] - t - (i <= other.nr ? other.a[i] : 0);
if(tmp.a[i] < 0)
t = 1, tmp.a[i] += 10;
else
t = 0;
}
tmp.nr = i;
for(; tmp.a[tmp.nr] == 0 && tmp.nr > 1; tmp.nr--);
return tmp;
}
};
string s;
Number p, ans, lim;
void print(Number num) {
for(int i = num.nr; i >= 1; i--)
cout << num.a[i];
cout << "\n";
}
Number Pow(Number num, int put) {
Number x, ans;
ans.nr = ans.a[1] = 1;
x = num;
for(int i = 0; (1 << i) <= put; i++) {
if((1 << i) & put) {
ans = ans * x;
if(ans.nr > 100)
return ans;
}
x = x * x;
}
return ans;
}
bool check(int put, bool ok) {
Number st = Number(), mid;
if(!ok)
lim.nr = 10, lim.a[10] = 1;
else
lim.nr = 33, lim.a[33] = 1;
st.nr = st.a[1] = 1;
while(st <= lim) {
mid = (st + lim) / 2;
if(Pow(mid, put) <= p)
st = mid + (Number)1;
else
lim = mid - (Number)1;
}
ans = lim;
return (Pow(ans, put) == p);
}
int main() {
cin >> s;
for(int i = s.size() - 1; i >= 0; i--)
p.a[++p.nr] = s[i] - '0';
for(int put = 100; put >= 2; put--) {
if(check(put, (put <= 10))) {
for(int i = ans.nr; i >= 1; i--)
cout << ans.a[i];
cout << '\n' << put;
return 0;
}
}
print(p);
cout << 1;
return 0;
}