[NOI2001]方程的解数
2015-08-26 20:06
316 查看
题目
DFS(meet in the middle)
![](http://img.blog.csdn.net/20150722151415764)
通过此条件剪枝,由于本题数据较大,可通过HASH表存储方案数。
DFS(meet in the middle)
通过此条件剪枝,由于本题数据较大,可通过HASH表存储方案数。
[code]#include<cstdio> #include<vector> #include<cmath> #include<cstdlib> using namespace std; #define MAXN 6 #define MAXH 4999999 struct node{ int pos,cnt; node *next; }*adj[MAXH+10]; void addnode(int pos){ node *p=new node; p->pos=pos; p->cnt=1; p->next=adj[abs(pos%MAXH)]; adj[abs(pos%MAXH)]=p; } int n,m,k[MAXN+2],p[MAXN+2],mid,ans,mypow[160][10]; void read(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&k[i],&p[i]); } void dfs1(int i,int sum){ if(i>mid){ int h=abs(sum%MAXH); node *p; for(p=adj[h];p;p=p->next) if(p->pos==sum){ p->cnt++; break; } if(!p) addnode(sum); return; } for(int x=1;x<=m;x++){ long long t=sum+k[i]*(long long)mypow[x][i]; if(abs(t)>0x7f7f7f7f) break; dfs1(i+1,(int)t); } } void dfs2(int i,int sum){ if(i==mid){ int h=abs(sum%MAXH); node *p; for(p=adj[h];p;p=p->next) if(p->pos==sum){ ans+=p->cnt; break; } return; } for(int x=1;x<=m;x++){ long long t=sum-k[i]*(long long)mypow[x][i]; if(abs(t)>0x7f7f7f7f) break; dfs2(i-1,(int)t); } } int main() { read(); int i,j; for(i=1;i<=150;i++){ for(j=1;j<=n;j++) mypow[i][j]=pow(i,p[j]); } mid=n/2; dfs1(1,0); dfs2(n,0); printf("%d\n",ans); }
相关文章推荐
- 将图片转成字节流
- HDU 1051.Wooden Sticks
- 模式匹配KMP算法
- 连接池的使用(一)
- struts2框架开发的第一个应用
- struts2中访问和添加Application、session以及request属性
- 黑马程序员-java中的反射总结
- 验证
- ex07
- 快速排序(含完整源码)
- iOS小技巧--用runtime 解决UIButton 重复点击问题
- Jvm --- 常用工具
- sublime Text 3 光标
- 修改帝国CMS标签
- hdu1863-畅通工程
- C与汇编混合编程
- 欢迎使用CSDN-markdown编辑器
- LeetCode题解:Remove Linked List Elements
- spring boot初步尝试
- php的工作模型和运行机制