Cod sursa(job #2705515)

Utilizator stefantagaTaga Stefan stefantaga Data 12 februarie 2021 18:33:58
Problema Numere 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f ("numere2.in");
ofstream g ("numere2.out");

struct Number {
  short nr, a[1005];
  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;
      }
    }
    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;
  }
};

int n;

string s;
Number num,sol,solf,sol1,p,st,dr;
int i,k,ok,j;
int main() {
  f >> s;
  for(int i = s.size() - 1; i >= 0; i--)
    num.a[++num.nr] = s[i] - '0';
  Number l = (Number)1, r, mij;
  r.nr = 51, r.a[51] = 1;
  for (i=2;i<=15;i++)
  {
      st=(Number)1;
      dr.nr=51,dr.a[51]=1;
      while (st<=dr)
      {
          mij=(st+dr)/2;
          p=(Number)1;
          for (k=1;k<=i;k++)
          {
              p=p*mij;
          }
          if (p<=num)
          {
              sol=p;
              sol1=mij;
              st=mij+(Number)1;
          }
          else
          {
              dr=mij-(Number)1;
          }
      }
      if (sol==num)
      {
          ok=i;
          solf=sol1;
      }
  }
  for (j=solf.nr;j>=1;j--)
  {
      g<<solf.a[j];
  }
  g<<'\n'<<ok;
  return 0;
}