HDU6216
A Cubic number and A Cubic Number
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 313 Accepted Submission(s): 184
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
a^3-b^3 == p,p为质数,所以a-b=1
1 //2017-09-17 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define ll long long 7 8 using namespace std; 9 10 const int N = 600000; 11 12 ll cubic[N+100]; 13 ll diff[N+100]; 14 15 bool check(ll p){ 16 int pos = lower_bound(diff+1, diff+N, p) - diff; 17 if(diff[pos] == p) 18 return true; 19 return false; 20 } 21 22 int main() 23 { 24 int T; 25 scanf("%d", &T); 26 ll p; 27 for(ll i = 1; i <= N; i++) 28 cubic[i] = i*i*i; 29 for(int i = 1; i <= N; i++) 30 diff[i] = cubic[i+1]-cubic[i]; 31 while(T--){ 32 scanf("%lld", &p); 33 if(check(p)) 34 printf("YES\n"); 35 else printf("NO\n"); 36 } 37 38 return 0; 39 }