题目链接:HDU6216
询问一个质数p是否可以写成两个立方数的差。
根据立方差公式,a^3-b^3=(a-b)(a^2+ab+b^2),如果p=(a-b)(a^2+ab+b^2),则必有a-b=1,因为质数的因子只有1和它本身,a^2+ab+b^2显然是大于1的。
然后把a=b+1代换,可得p=3b^2+3b+1,预处理+二分查找。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <string>
#define ll long long
using namespace std;
const int MAXN = 1e6 + 5;
ll tab[MAXN];
void init()
{
for (ll i = 0;i < MAXN;++i)
tab[i] = 3 * i*i + 3 * i + 1;
}
int main()
{
int T;
scanf("%d", &T);
init();
for (int i = 1;i <= T;++i)
{
bool flag = false;
ll v;
scanf("%I64d", &v);
int left = 0, right = MAXN-1;
int mid = (left + right) >> 1;
while (left <= right)
{
if (v == tab[mid])
{
flag = true;
break;
}
else if (v > tab[mid])
left = mid + 1;
else
right = mid - 1;
mid = (left + right) >> 1;
}
if (flag)
printf("YES\n");
else
printf("NO\n");
}
//system("pause");
return 0;
}