Problem p02690 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

// 小数点以下桁数
// fixed << setprecision(i)

int64_t gcd(int64_t a, int64_t b) { return (a % b == 0 ? b : gcd(b, a % b)); }
int64_t lcm(int64_t a, int64_t b) { return a / gcd(a, b) * b; }
int factorial(int a) {
  int b = 1;
  while (a) {
    b *= a--;
  }
  return b;
} // 13以下対応
bool is_prime(int64_t a) {
  if (a <= 1)
    return false;
  for (int64_t i = 2; (int64_t)i * i <= a; i++) {
    if (a % i == 0)
      return false;
  }
  return true;
}
int get_adp(double x, int n) {
  return (int)round((x - (int)x) * pow(10, n)) % 10;
} // 小数点以下の指定桁の値を取得
int64_t sigma(int64_t s, int64_t n) { return n * (2 * s + n - 1) / 2; }

// 順列の全列挙
//  vector<int> v(N);
//  iota(v.begin(), v.end(), 1);       // v に 1, 2, ... N を設定
//  do {
//	for(auto x : v) cout << x << " "; cout << "\\n";     // v の要素を表示
//  } while( next_permutation(v.begin(), v.end()) );

// bit全探索
//  for (int tmp = 0; tmp < (1 << ビット数); tmp++) {
//	bitset<ビット数> s(tmp);
//	// (ビット列sに対する処理)
//  }

int main() {
  int64_t x, a, b, temp, ans1, ans2;

  cin >> x;
  queue<int64_t> q;
  for (int64_t i = 1; i * i <= x; i++) {
    if (x % i != 0)
      continue;
    q.push(x / i);
    for (int64_t j = i / 2; j < x; j++) {
      a = pow(j, 5);
      b = pow(j - i, 5);
      if (a - b >= x) {
        ans1 = j;
        ans2 = j - i;
        break;
      }
    }
    if (a - b == x)
      break;
  }
  if (a - b != x) {
    while (!q.empty()) {
      temp = q.front();
      q.pop();
      for (int64_t j = temp / 2; j < x; j++) {
        a = pow(j, 5);
        b = pow(j - temp, 5);
        if (a - b >= x) {
          ans1 = j;
          ans2 = j - temp;
          break;
        }
      }
      if (a - b == x)
        break;
    }
  }
  cout << ans1 << " " << ans2 << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

// 小数点以下桁数
// fixed << setprecision(i)

int64_t gcd(int64_t a, int64_t b) { return (a % b == 0 ? b : gcd(b, a % b)); }
int64_t lcm(int64_t a, int64_t b) { return a / gcd(a, b) * b; }
int factorial(int a) {
  int b = 1;
  while (a) {
    b *= a--;
  }
  return b;
} // 13以下対応
bool is_prime(int64_t a) {
  if (a <= 1)
    return false;
  for (int64_t i = 2; (int64_t)i * i <= a; i++) {
    if (a % i == 0)
      return false;
  }
  return true;
}
int get_adp(double x, int n) {
  return (int)round((x - (int)x) * pow(10, n)) % 10;
} // 小数点以下の指定桁の値を取得
int64_t sigma(int64_t s, int64_t n) { return n * (2 * s + n - 1) / 2; }

// 順列の全列挙
//  vector<int> v(N);
//  iota(v.begin(), v.end(), 1);       // v に 1, 2, ... N を設定
//  do {
//	for(auto x : v) cout << x << " "; cout << "\\n";     // v の要素を表示
//  } while( next_permutation(v.begin(), v.end()) );

// bit全探索
//  for (int tmp = 0; tmp < (1 << ビット数); tmp++) {
//	bitset<ビット数> s(tmp);
//	// (ビット列sに対する処理)
//  }

int main() {
  int64_t x, a, b, temp, ans1, ans2;

  cin >> x;
  for (int64_t i = 1; i * i <= x; i++) {
    if (x % i != 0)
      continue;
    temp = x / i;
    for (int64_t j = i / 2; j < x; j++) {
      a = pow(j, 5);
      b = pow(j - i, 5);
      if (a - b >= x) {
        ans1 = j;
        ans2 = j - i;
        break;
      }
    }
    if (a - b == x)
      break;
    for (int64_t j = temp / 2; j < x; j++) {
      a = pow(j, 5);
      b = pow(j - temp, 5);
      if (a - b >= x) {
        ans1 = j;
        ans2 = j - temp;
        break;
      }
    }
    if (a - b == x)
      break;
  }
  cout << ans1 << " " << ans2 << endl;
}