湘潭校赛 Bob's Problem

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\n");
78             else printf("No\n");
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\n");
31         else printf("Yes\n");
32     }
33     return 0;
34 }

 

转载于:https://www.cnblogs.com/tom987690183/p/3602365.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值