Cod sursa(job #2705517)

Utilizator stefantagaTaga Stefan stefantaga Data 12 februarie 2021 18:35:39
Problema Numere 2 Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.6 kb
#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;
}