Bob's Problem |
||
Accepted : 18 | Submit : 115 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
题目描述Bob今天碰到一个问题,他想知道x3+y3 = c 是否存在正整数解? 输入第一行是一个整数K(K≤20000),表示样例的个数。 以后每行一个整数c(2≤c≤109) 输出每行输出一个样例的结果,如果存在,输出“Yes”,否则输出“No”。(引号不用输出) 样例输入2 28 27 样例输出Yes No |
哈希
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 const int INF = 100007; 8 int a[1003]; 9 10 struct node 11 { 12 int num; 13 struct node *next; 14 }; 15 struct node f[INF]; 16 17 void Insert(int x) 18 { 19 struct node *p,*q; 20 int k; 21 k=x%INF; 22 p=&f[k]; 23 while( p!=NULL && p->num!=x) 24 { 25 p=p->next; 26 } 27 if( p==NULL ) 28 { 29 q=(struct node*)malloc(sizeof(struct node)); 30 q->next=f[k].next; 31 q->num=x; 32 f[k].next=q; 33 } 34 } 35 bool found(int x) 36 { 37 int k; 38 struct node *p; 39 k=x%INF; 40 p=&f[k]; 41 while( p!=NULL && p->num!=x) 42 { 43 p=p->next; 44 } 45 if( p==NULL) 46 return false; 47 if( p->num==x) 48 return true; 49 } 50 void prepare() 51 { 52 int i,j; 53 for(i=1;i<=1000;i++) 54 a[i]=i*i*i; 55 56 for(i=0;i<INF;i++) 57 { 58 f[i].num=0; 59 f[i].next=NULL; 60 } 61 for(i=1;i<=1000;i++) 62 for(j=i;j<=1000;j++) 63 { 64 Insert(a[i]+a[j]); 65 } 66 } 67 int main() 68 { 69 int n,i,x; 70 prepare(); 71 while(scanf("%d",&n)>0) 72 { 73 for(i=1;i<=n;i++) 74 { 75 scanf("%d",&x); 76 if( found(x)==true ) 77 printf("Yes "); 78 else printf("No "); 79 } 80 } 81 return 0; 82 }
set
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 #include<set> 6 #include<algorithm> 7 using namespace std; 8 9 int a[1001]; 10 set<int> Q; 11 void prepare() 12 { 13 int i,j; 14 for(i=1;i<=1000;i++) 15 a[i]=i*i*i; 16 Q.clear(); 17 for(i=1;i<=1000;i++) 18 for(j=i;j<=1000;j++) 19 Q.insert(a[i]+a[j]); 20 } 21 int main() 22 { 23 int T,n; 24 prepare(); 25 scanf("%d",&T); 26 while(T--) 27 { 28 scanf("%d",&n); 29 int flag=Q.count(n); 30 if(flag==0)printf("No "); 31 else printf("Yes "); 32 } 33 return 0; 34 }