Submission #1362999

#TimeUsernameProblemLanguageResultExecution timeMemory
1362999tolbiBalanced Integer (CCO25_day1problem3)C++20
2 / 25
30088 ms432 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100], b[100];
pair<int,int> range(int l, int r, int B) {
  int cc = 0;
  int mi = 0;
  int ma = 0;
  while (r) {
    a[cc]=l%B;
    mi += l%B;
    ma += r%B;
    b[cc++]=r%B;
    l/=B, r/=B;
  }
  int ret = 0;
  cc--;
  while (cc >= 0) {
    if (a[cc] == b[cc]) {
      ret += a[cc];
    } else {
      return {min(mi, ret + a[cc]+1), max(ma, ret + b[cc] - 1 + cc * (B - 1))};
    }
    cc--;
  }
  return {ret, ret};
}
int32_t main(){
  ios_base::sync_with_stdio(false);
  cin.tie(0);   
  int B, N;
  cin >> B >> N;
  auto solve = [&](int l, int r, auto &&solve)->int{
    bool valid = true;
    for (int i = 2; i <= B; i++) {
      __int128 x = i, y = 1;
      while (x <= l) {
        x *= i;
        y++;
      }
      if (x <= r) continue;
      auto sum = range(l, r, i);
      if (((i-1)*y)%2) valid = false;
      else {
        int req = (i-1)*y/2;
        if (req > sum.second || req < sum.first) valid = false;
      }
    }
    if (!valid) return -1;
    if (l == r) return l;
    int m = l + r >> 1;
    int c1 = solve(l, m, solve);
    if (c1 != -1) return c1;
    return solve(m + 1, r, solve);
  };
  cout << solve(N, 1000000000000000000, solve) << '\n';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...