Description
给出一个素数pp,判断是否为两个立方数之差
Input
第一行一整数TT表示用例组数,每组用例输入一素数(1≤T≤100,2≤p≤1012)(1≤T≤100,2≤p≤1012)
Output
如果pp可以表示为两个立方数之差则输出,否则输出NONO
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−b3p=a3−b3,显然a>b>0a>b>0,则p=(a−b)(a2+ab+b2)p=(a−b)(a2+ab+b2),由于pp为素数且,故a−b=1,a2+ab+b2=pa−b=1,a2+ab+b2=p,将a=b+1a=b+1带入有p=3b2+3b+1p=3b2+3b+1,二分bb即可
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;
}