poj 1840 Eqs
2011-03-09 15:12
471 查看
hash的应用,我直接映射了,差点超内存,听说有好的方法,这些数的范围还是很大的,-50^4*2·····50^4*2
,但是最多才100*100个数,所以可以通过hash函数映射,懒得想了
http://blog.csdn.net/ChinaCzy/archive/2010/08/05/5791573.aspx
下面的是真正的hash,写了一下,速度差不多
,但是最多才100*100个数,所以可以通过hash函数映射,懒得想了
http://blog.csdn.net/ChinaCzy/archive/2010/08/05/5791573.aspx
#include<iostream> using namespace std; #define N 37500005 #define M 18750000 struct Hash { char index; Hash(){index=0;} }; Hash ys ; int three(int i) { return i*i*i; } void init(Hash *h,int a1,int a2) { int i,j,temp; for(i=-50;i<=50;i++) { if(i==0) continue; for(j=-50;j<=50;j++) { if(j==0) continue; temp=M-a1*three(i)-a2*three(j); h[temp].index++; } } } int main() { int a1,a2,a3,a4,a5,i,j,k,temp,sum=0; scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5); init(ys,a1,a2); for(i=-50;i<=50;i++) { if(i==0)continue; for(j=-50;j<=50;j++) { if(j==0)continue; for(k=-50;k<=50;k++) { if(k==0)continue; temp=a5*three(k)+a4*three(j)+a3*three(i)+M; sum+=ys[temp].index; } } } printf("%d/n",sum); return 0; }
下面的是真正的hash,写了一下,速度差不多
#include<iostream> using namespace std; #define neg 12500000 #define N 10005 #define maxn 1000007 struct Hash { int index; Hash *next; Hash(){index=-1,next=NULL;} Hash(int i){index=i,next=NULL;} }; struct result { int data,cnt; }; result res ; Hash ys[maxn]; int m=0,_max=-100000000,_min=100000000; int found(Hash *h,int sum) { int temp=sum%maxn; if(h[temp].index==-1) return 0; Hash *ptr=&h[temp]; while(ptr) { if(res[ptr->index].data==sum) return res[ptr->index].cnt; ptr=ptr->next; } return 0; } int three(int i) { return i*i*i; } void init(Hash *h,int a1,int a2) { int i,j,sum; Hash *ptr; bool t; for(i=-50;i<=50;i++) { if(i==0)continue; for(j=-50;j<=50;j++) { if(j==0)continue; sum=neg-a1*three(i)-a2*three(j); if(sum>_max) _max=sum; if(sum<_min) _min=sum; if(h[sum%maxn].index==-1) { res[m].cnt=1; res[m].data=sum; h[sum%maxn].index=m++; } else { t=false; ptr=&h[sum%maxn]; while(ptr) { if(res[ptr->index].data==sum) { res[ptr->index].cnt++; t=true; break; } ptr=ptr->next; } if(!t) { res[m].cnt=1; res[m].data=sum; ptr=&h[sum%maxn]; while(ptr->next) ptr=ptr->next; ptr->next=new Hash(m++); } } } } } int main() { int a1,a2,a3,a4,a5; int i,j,k,m=0,sum; scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5); init(ys,a1,a2); for(i=-50;i<=50;i++) { if(i==0)continue; for(j=-50;j<=50;j++) { if(j==0)continue; for(k=-50;k<=50;k++) { if(k==0)continue; sum=neg+a3*three(i)+a4*three(j)+a5*three(k); if(sum>_max||sum<_min) continue; m+=found(ys,sum); } } } printf("%d/n",m); return 0; }
相关文章推荐
- poj 1840 Eqs
- Eqs--POJ 1840
- HDU_1496 Equations && POJ_1840 Eqs(Hash)
- poj 1840 Eqs
- poj-1840 Eqs
- POJ 1840 Eqs
- poj 1840:Eqs
- poj 1840 Eqs
- poj 1840 Eqs
- POJ 1840--Eqs
- POJ 1840 Eqs
- POJ1840--------Eqs
- Eqs POJ - 1840
- POJ-1840 Eqs
- POJ 1840 Eqs(hash)
- POJ - 1840 Eqs解题报告
- POJ-1840-Eqs【哈希】
- POJ 1840 Eqs
- POJ 1840 Eqs
- poj 1840 Eqs(二分)