您的位置:首页 > 其它

湘潭校赛 Bob's Problem

2014-03-15 18:57 253 查看

Bob's Problem

Accepted : 18Submit : 115
Time Limit : 1000 MSMemory Limit : 65536 KB

题目描述

Bob今天碰到一个问题,他想知道x3+y3 = c 是否存在正整数解?

输入

第一行是一个整数K(K≤20000),表示样例的个数。 以后每行一个整数c(2≤c≤109)

输出

每行输出一个样例的结果,如果存在,输出“Yes”,否则输出“No”。(引号不用输出)

样例输入

2
28
27

样例输出

Yes
No

哈希

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF =  100007;
int a[1003];

struct node
{
int num;
struct node *next;
};
struct node f[INF];

void Insert(int x)
{
struct node *p,*q;
int k;
k=x%INF;
p=&f[k];
while( p!=NULL && p->num!=x)
{
p=p->next;
}
if( p==NULL )
{
q=(struct node*)malloc(sizeof(struct node));
q->next=f[k].next;
q->num=x;
f[k].next=q;
}
}
bool found(int x)
{
int k;
struct node *p;
k=x%INF;
p=&f[k];
while( p!=NULL && p->num!=x)
{
p=p->next;
}
if( p==NULL)
return false;
if( p->num==x)
return true;
}
void prepare()
{
int i,j;
for(i=1;i<=1000;i++)
a[i]=i*i*i;

for(i=0;i<INF;i++)
{
f[i].num=0;
f[i].next=NULL;
}
for(i=1;i<=1000;i++)
for(j=i;j<=1000;j++)
{
Insert(a[i]+a[j]);
}
}
int main()
{
int n,i,x;
prepare();
while(scanf("%d",&n)>0)
{
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if( found(x)==true )
printf("Yes\n");
else printf("No\n");
}
}
return 0;
}


set

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<set>
#include<algorithm>
using namespace std;

int a[1001];
set<int> Q;
void prepare()
{
int i,j;
for(i=1;i<=1000;i++)
a[i]=i*i*i;
Q.clear();
for(i=1;i<=1000;i++)
for(j=i;j<=1000;j++)
Q.insert(a[i]+a[j]);
}
int main()
{
int T,n;
prepare();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int flag=Q.count(n);
if(flag==0)printf("No\n");
else printf("Yes\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: