题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6216
题目意思:
给出一个p,p是素数(2 <= p <=1e12),判断是否存在正整数a,b使得
a*a*a - b*b*b = p
如果存在输出YES,否则输出NO。
我们知道立方差公式:
a*a*a - b*b*b = (a-b)(a*a+a*b+b*b)
我们知道a*a*a - b*b*b = prime(素数)
所以(a-b)(a*a+a*b+b*b) = prime;
由因为prime 只能由1*prime得来。
所以prime = 1*prime
所以(a-b) = 1, (a*a+a*b+b*b) = prime , a,b必是两个相邻的整数。
设b = x,a = x+1
则 (x+1)^3-x^3 = 3*x*x + 3*x + 1 = prime
3*x*x + 3*x = prime-1
x*x + x = (prime-1)/3
x(x+1) = (prime-1)/3
令:(prime-1)/3 = T;
x = int(sqrt(T)) //解出一个x
若x*(x+1) == T
则说明存在一个整数a,是的a^3 - (a-1)^3 等于当前所输入的素数。
这个a就是我们解出的x再加1.
AC代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double n,prime;
scanf("%lf",&prime);
double ans = prime;
prime = prime - 1;
n = prime/3;
int a=(int)(sqrt(n));
int b=a+1;
if((double)a*b==n)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}