おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

CODE FESTIVAL 2014 決勝 C - N進数

問題

問題文へ

10以上の整数Nで、N進数でNとなる数字をf(N)とします。

f(23)は、2*23+3=49

この49にあたるのが、入力Aです。10以上の整数からf(k)となるkを出力します。kが存在しない場合は-1を出力します。

制約

  • 1 \leqq A \leqq 10^{16}

考えたこと

Aが最大値でも、kは10000なことがサンプルでもわかります。10からすべてを試せばよさそうです。

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  ll A;
  cin >> A;

  for (ll k = 10; k <= 10000; ++k) {
    ll n = k;
    ll fk = 0;
    ll d = 0;
    while (n > 0) {
      ll temp = n % 10;
      rep(i, d) temp *= k;
      fk += temp;
      ++d;
      n /= 10;
    }
    if (fk == A) {
      cout << k << endl;
      return 0;
    }
  }

  cout << -1 << endl;
  
  return 0;
}