题意:
给定一个质数p,判断p是否是某两个立方数的差。
立方数的定义:立方数是一个数的3次方,例如27=33,27是立方数。
数据范围:2<=p<=1e12
解法:
由题得:
a
3
−
b
3
=
p
a^3-b^3=p
a3−b3=p
由立方差公式得:
a
3
−
b
3
=
(
a
−
b
)
(
a
2
+
a
b
+
b
2
)
=
p
a^3-b^3=(a-b)(a^2+ab+b^2)=p
a3−b3=(a−b)(a2+ab+b2)=p
因为p是质数,那么(a-b)=1和(a2+ab+b2)不能同时>1,否则就是合数。
显然当a,b>=1时,(a2+ab+b2)一定大于1,那么(a-b)必须等于1,
a
−
b
=
1
a-b=1
a−b=1
a
=
b
+
1
a=b+1
a=b+1
则两个数一定相邻,预处理一下相邻立方数的差值,因为是有序的,可以二分p是否在里面。
这题不能用map,居然会超内存
ps:
立方和预处理到1e6够了,1e63-(1e6-1)3接近3e12。
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxm=1e6+5;
ll f[maxm];
void init(){
for(ll i=2;i<=1e6;i++){//i是ll类型
f[i]=i*i*i-(i-1)*(i-1)*(i-1);
}
}
signed main(){
init();
int T;scanf("%d",&T);
while(T--){
ll p;scanf("%lld",&p);
bool ok=0;
int l=2,r=1e6;
while(l<=r){
int mid=(l+r)/2;
if(f[mid]==p){
ok=1;break;
}
if(f[mid]>p){
r=mid-1;
}else{
l=mid+1;
}
}
if(ok)puts("YES");
else puts("NO");
}
return 0;
}