题目描述
「你来了啊,埃尔梅罗二世」这一切事件的元凶正站在那圣杯之下「这一切都要结束了」 「呜」我的想法被现实无情的敲碎了,从见到那位从者的那一刻我就该意识到圣杯也许是残缺的,但是依然是圣杯。从一开始就没有办法阻止这个仪式,这七骑从者中早已有六骑陨落。这场虚伪的战争早已写下了胜者的名字。之前的影从者也只是幌子罢了,只是希望的残影。和我缔结了契约的理查一世也如同燃烧后的灰烬一般消失了。 「那么,你就要到达根源了吗」 「那是不可能的」他的脸上没有任何表情,只是完全的冷漠「你还带着四骑士之信吧,最终的答案就写在信上」 「why dun it」 「到了如今这个地步,做这件事的原因你已然了解于心中,为何还要一介亡人来回答呢。我已经放弃了,而你还没有吧,太可悲了」 我还想更进一步的询问,但他已经消失了。我打开随身携带的那封信,上面写着许多数字,都是质数。其中有的质数可能等于某两个正整数的立方差。判断出所给的每个质数是否与某两个正整数的立方差相等,我终于发现了最终他要说的是什么了。
输入描述:
第一行输入一个整数T (1<=T<=100),代表有T个样例。对于每组样例,输入一行,每行输入一个质数p (2<=p<=10的十五次幂)
输出描述:
对于每一组样例,若p与某两个正整数的立方差相等,输出"YES",否则输出"NO"(不包括双引号
发现题目给的数据范围很大
使用传统的枚举暴力时间复杂度为n的三次方
不可取
所以我们找题目中的条件,发现p一定为质数
又因为立方差公式a的三次方-b的三次方=(a-b)(aa+bb+ab)因为ab都为正整数,所以后面一定大于一
又因为p为质数,易得(a-b)一定为1,
此时问题被大大简化了
只需满足当(a-b)=1是(aa+b*b+ab)=p即可
下为ac代码
在这里插入代码片
#include<cstdio>
#include<cstring>
#include<algorithm>
int work(long long x){
if(x<=0){
return 0;
}
for(long long i=1;i*i+i*(i+1)+(i+1)*(i+1)<=x;i++){
if(i*i+i*(i+1)+(i+1)*(i+1)==x){
return 1;
}
}
return 0;
}
int main(){
int n;
scanf("%d",&n);
while(n--){
long long w;
scanf("%lld",&w);
if(work(w)){
printf("YES");
}else{
printf("NO");
}
if(n){
printf("\n");
}
}
return 0;
}