T1【两个立方体】求助

#include<bits/stdc++.h>
#define int long long
using namespace std;
bool find(int x){
	for(int a=1;a*a*a<=x;a++){
		int ck=x-a*a*a;
        if(ck<0){
            continue;
        }
		int l=1,r=cbrt(ck);
		while(l<=r){
			int mid=(l+r)/2;
			int cb=mid*mid*mid;
			if(cb==ck){
				return 1;
			}
			else if(cb<ck){
				l=mid+1;
			}
			else{
				r=mid-1;
			}
		}
	}
	return 0;
}
signed main(){
	int t,k;
	cin>>t;
	for(int i=1;i<=t;i++){
		cin>>k;
		if(!find(k)){
			cout<<"NO"<<endl;
		}
		else{
			cout<<"YES"<<endl;
		}
	}
	return 0;
}

WA70,help!

存在精度问题,你可以把它改成sqrt(ck)

1 个赞

?为啥?真的能AC!

sqrt不是立方吗?

sqrt是平方

口误 sqrt不是平方吗?

#include<bits/stdc++.h>
#define int long long
using namespace std;
bool find(int x){
	for(int a=1;pow(a,3)<=x;a++){
		int ck=x-pow(a,3);
		int l=1,r=sqrt(ck);
		while(l<=r){
			int mid=(l+r)/2;
			int cb=pow(mid,3);
			if(cb==ck){
				return 1;
			}
			else if(cb<ck){
				l=mid+1;
			}
			else{
				r=mid-1;
			}
		}
	}
	return 0;
}
signed main(){
	int t,k;
	cin>>t;
	for(int i=1;i<=t;i++){
		cin>>k;
		if(!find(k)){
			cout<<"NO"<<endl;
		}
		else{
			cout<<"YES"<<endl;
		}
	}
	return 0;
}
``` 不信你自己测

不信你自己测

sqrt是开平方

楼上说的,结果我一交ac了……

sqrt(ck)必定大于ck的立方,而cbrt(ck) 存在精度问题,可能小于ck的立方。

有道理

谢谢楼上大佬

放到问题讨论区