Problem:
Score : 400 points

Problem Statement

Give a pair of integers (A, B) such that A^5-B^5 = X.
It is guaranteed that there exists such a pair for the given integer X.

Constraints

1 \leq X \leq 10^9

X is an integer.

There exists a pair of integers (A, B) satisfying the condition in Problem Statement.

Input

Input is given from Standard Input in the following format:

X

Output

Print A and B, with space in between.
If there are multiple pairs of integers (A, B) satisfying the condition, you may print any of them.

A B

Sample Input 1

33

Sample Output 1

2 -1

For A=2 and B=-1, A^5-B^5 = 33.

Sample Input 2

1

Sample Output 2

0 -1

Solution in C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoder2 {
	class Program {
		static void Main(string[] args) {
			var inputArray = retreiveLongArray();
			var inputCount = 1;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}
			long X = inputArray[0];


			//B < 0を想定
			long maxA = 100;

			for (long a = 0; a <= maxA; a++) {

				var target = X - a * a * a * a * a;//B^5が満たすべき数(正負反転すみ) 
				if(target < 0) {
					break;
				}
				//B=0
				if (target == 0) {
					Console.WriteLine($"{a} {0}");
					return;
				}
				//2分探索で条件を満たすBが存在するか探す
				long max = 100;
				long min = 1;
				long mid = (max + min) / 2;
				while (true) {
					mid = (max + min) / 2;

					var result = target - mid * mid * mid * mid * mid;
					if (result == 0) {
						Console.WriteLine($"{a} {-mid}");
						return;
					}

					if(result > 0) {//midが小さすぎる
						min = mid;
					}
					if (result < 0) {//midがおおきすぎる
						max = mid;
					}

					if (min+1 == max) {//minとmaxが1違いなのに見つからないときはあきらめる
						var result2 = target - min * min * min * min * min;
						if (result2 == 0) {
							Console.WriteLine($"{a} {-min}");
							return;
						}
						var result3 = target - max * max * max * max * max;
						if (result3 == 0) {
							Console.WriteLine($"{a} {-max}");
							return;
						}
						break;
					}
				}
			}
			// B >0を想定 aはどこまでも大きい可能性ある
			///////////////////////////////////////////////////////////////////////
			for (long a = 0; a <= 100000000000000; a++) {

				var target = a * a * a * a * a-X;//B^5が満たすべき数
				if (target < 0) {
					continue;
				}
				//B=0
				if (target == 0) {
					Console.WriteLine($"{a} {0}");
					return;
				}
				//2分探索で条件を満たすBが存在するか探す
				long max = a;
				long min = 1;
				long mid = (max + min) / 2;
				while (true) {
					mid = (max + min) / 2;

					var result = target - mid * mid * mid * mid * mid;
					if (result == 0) {
						Console.WriteLine($"{a} {mid}");
						return;
					}

					if (result > 0) {//midが小さすぎる
						min = mid;
					}
					if (result < 0) {//midがおおきすぎる
						max = mid;
					}

					if (min + 1 == max) {//minとmaxが1違いなのに見つからないときはあきらめる
						var result2 = target - min * min * min * min * min;
						if (result2 == 0) {
							Console.WriteLine($"{a} {min}");
							return;
						}
						var result3 = target - max * max * max * max * max;
						if (result3 == 0) {
							Console.WriteLine($"{a} {max}");
							return;
						}
						break;
					}
				}
			}

		}

		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray = Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}
}