您的位置:首页 > 其它

poj 1186 方程的解数 折半枚举+hash

2015-12-02 22:44 309 查看
//poj 1186
//sep9
#include <iostream>
using namespace std;
const int HASHLEN=1000023;
const int MAXNODENUM=4000024;
int n,m,ans,e,tag;
int k[32],p[32];
int head[HASHLEN+10];

struct Node{
int val,cnt,nxt;
}edge[MAXNODENUM+10];

int hash_value(int x)
{
return x>0?x%HASHLEN:x%HASHLEN+HASHLEN;
}

void insert(int x)
{
int y=hash_value(x);
for(int i=head[y];i!=-1;i=edge[i].nxt){
if(edge[i].val==x){
++edge[i].cnt;
return ;
}
}
edge[e].val=x,edge[e].cnt=1,edge[e].nxt=head[y],head[y]=e++;
}

int lookup(int x)
{
int y=hash_value(x);
for(int i=head[y];i!=-1;i=edge[i].nxt)
if(edge[i].val==x)
return edge[i].cnt;
return 0;
}

void dfs(int cur,int end,int sum)
{
if(cur==end){
if(tag==0)
insert(sum);
else
ans+=lookup(-sum);
return ;
}
for(int i=1;i<=m;++i){
int t=1;
for(int j=0;j<p[cur];++j)
t*=i;
dfs(cur+1,end,sum+k[cur]*t);
}
}

int main()
{
memset(head,-1,sizeof(head));
ans=e=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
scanf("%d%d",&k[i],&p[i]);
tag=0;
dfs(0,n/2,0);
tag=1;
dfs(n/2,n,0);
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法