题意:
给定一个质数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
++){
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;
}