Description
给出一个素数 p p ,判断是否为两个立方数之差
Input
第一行一整数 T T 表示用例组数,每组用例输入一素数 (1≤T≤100,2≤p≤1012) ( 1 ≤ T ≤ 100 , 2 ≤ p ≤ 10 12 )
Output
如果 p p 可以表示为两个立方数之差则输出,否则输出 NO N O
Sample Input
10
2
3
5
7
11
13
17
19
23
29
Sample Output
NO
NO
NO
YES
NO
NO
NO
YES
NO
NO
Solution
假设 p=a3−b3 p = a 3 − b 3 ,显然 a>b>0 a > b > 0 ,则 p=(a−b)(a2+ab+b2) p = ( a − b ) ( a 2 + a b + b 2 ) ,由于 p p 为素数且,故 a−b=1,a2+ab+b2=p a − b = 1 , a 2 + a b + b 2 = p ,将 a=b+1 a = b + 1 带入有 p=3b2+3b+1 p = 3 b 2 + 3 b + 1 ,二分 b b <script type="math/tex" id="MathJax-Element-17">b</script>即可
Code
#include<cstdio>
using namespace std;
typedef long long ll;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ll p;
scanf("%I64d",&p);
int l=1,r=1000000,mid,flag=0;
while(l<=r)
{
mid=(l+r)>>1;
ll temp=3ll*mid*mid+3*mid+1;
if(temp==p)
{
flag=1;
break;
}
else if(temp>p)r=mid-1;
else l=mid+1;
}
printf("%s\n",flag?"YES":"NO");
}
return 0;
}