**
怎么判断一个素数能否分解成两个正整数的立方差?
**
也可以是p=3x^2+3x+1但是要求有没有大于0的正整数解
例题
链接:https://ac.nowcoder.com/acm/contest/3036/K
来源:牛客网
输入描述:
第一行输入一个整数T (1<=T<=100),代表有T个样例。
对于每组样例,输入一行,每行输入一个质数p (2<=p<=1015)
输出描述:
对于每一组样例,若p与某两个正整数的立方差相等,输出"YES",否则输出"NO"(不包括双引号)
示例1
输入
复制
5
2
3
5
7
11
输出
复制
NO
NO
NO
YES
NO
#include<iostream>
#include<map>
using namespace std;
int main(){
long long n;
long long item;
cin>>n;
long long i=2;
while(n--){
cin>>item;
int f=0;
for( i=1;i<item;i++){
if(3*i*i+3*i+1==item){
printf("YES\n");
f=1;
break;
}
if(3*i*i+3*i+1>item)break;
}
if(f==0)
printf("NO\n");
}
return 0;
}
教训
错误的滥用map函数,当map函数储存的数据过多时,再加上调用函数所多花费的时间,实际时间复杂度大于暴力搜索
错误原因:运行超时
#include<iostream>
#include<map>
using namespace std;
int main(){
long long n;
long long item;
cin>>n;
map<long long ,long long >mp;
long long i=1;
while(n--){
cin>>item;
int f=0;
if(mp[item]==1){
f=1;
printf("YES\n");
}
else
for( i;i<item;i++){
mp[i*3*i+3*i+1]=1;
if(3*i*i+3*i+1==item){
printf("YES\n");
f=1;
break;
}
if(3*i*i+3*i+1>item)break;
}
if(f==0)
printf("NO\n");
}
return 0;
}