湘潭校赛 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 }

 

你可能感兴趣的:(em)