A Cubic number and A Cubic Number
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
A cubic number is the result of using a whole number in a multiplication three times. For example,
3×3×3=27
so
27
is a cubic number. The first few cubic numbers are
1,8,27,64
and
125
. Given an prime number
p
. Check that if
p
is a difference of two cubic numbers.
Input
The first of input contains an integer
T (1≤T≤100)
which is the total number of test cases.
For each test case, a line contains a prime number p (2≤p≤1012) .
For each test case, a line contains a prime number p (2≤p≤1012) .
Output
For each test case, output 'YES' if given
p
is a difference of two cubic numbers, or 'NO' if not.
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
Source
输入输出测试
未AC代码:因为超内存
#include<stdio.h>
#include<iostream>
using namespace std;
long num[10000];
long subnum[80000000];
int main(){
int n,t;
int i,j;
int x,y;
cin>>n;
int cnt=1;
int flag=0;
for(i=1;i<=10000;i++){
num[i] = i*i*i;
}
for(i=1;i<=10000;i++){
for(j=1;j<i;j++){
subnum[cnt++]=num[i]-num[j];
}
}
for(x=1;x<=n;x++){
cin>>t;
for(y=1;y<=cnt;y++){
if(t==subnum[y]){
flag=1;
break;
}
else{
flag=0;
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
}
AC代码:
#include<stdio.h>
#include<iostream>
using namespace std;
long long subnum[1000000];
int main(){
long long n,t;
long long i,j;
int x,y;
cin>>n;
long cnt=1;
int flag=0;
for(i=1;i<=1000000;i++){
subnum[cnt++]=i*i*i-(i-1)*(i-1)*(i-1);
}
for(x=1;x<=n;x++)
{
cin>>t;
long long pos;
pos = lower_bound(subnum,subnum+cnt,t)-subnum;
if(subnum[pos]==t)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
如果两个数的立方差是素数,那么这两个数必定相邻。