# Binary Search# Brute Force# Cube Root

j063 - 11428 - Cubes

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個正整數 N,要求找到兩個正整數 x 和 y,使得 x^3 - y^3 = N。如果找不到這樣的 x 和 y,則輸出 "No solution"。如果有多組解,則輸出 y 值最小的那組解。

解題思路

題目要求找到 x 和 y 滿足 x^3 - y^3 = N。可以對 y 進行枚舉,然後使用二分搜尋法尋找對應的 x。對於每個 y,我們需要找到一個 x 使得 x = (N + y^3)^(1/3)。由於 x 必須是整數,因此可以使用二分搜尋法在 0 到 100 的範圍內尋找 x。如果找到這樣的 x,則輸出 x 和 y,並結束搜尋。如果枚舉完所有可能的 y 值後仍然沒有找到解,則輸出 "No solution"。

複雜度分析

  • 時間複雜度: O(100 * log(100)),其中 100 是 y 的最大值,log(100) 是二分搜尋的複雜度。
  • 空間複雜度: O(1)

程式碼

#include <iostream>
using namespace std;
long long n,j;
long long bs(long long l,long long r){
	if(l>r)return l;
	long long m=(l+r)/2;
	if(m*m*m-j*j*j<n)return bs(m+1,r);
	else return bs(l,m-1);
}
int  main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> n){
		if(n==0)return 0;
		bool ac=0;
		for(j=1;j<=100;++j){
			long long i=bs(0,100);
			if(i*i*i-j*j*j==n){
				cout << i << " " << j << "\n";
				ac=1;
				break;
			}
		}
		if(!ac)
			cout << "No solution\n";
	}
}

Discussion