poj1186——方程的解数
来源:互联网 发布:php取字符串后几位 编辑:程序博客网 时间:2024/06/15 12:36
题目大意:,1 <= xi <= M, i=1...n(1 <= n <= 6;1 <= M <= 150)
输入:n
M
ki pi(共n行)
输出:整数解的个数
分析:折半搜索+哈希。暴力枚举超时,所以将方程分成两半,先枚举前一半的解,将总值哈希存储,然后枚举后一半看看是否和左值相等,若是则是一个解。
代码:转载自http://blog.csdn.net/sepnine/article/details/50154181
- #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; //e为哈希邻接表中边结点个数
- 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;
- }
阅读全文
0 0
- poj1186——方程的解数
- 【poj1186】 方程的解数
- 【浅谈折半搜索】POJ1186[方程的解数]题解
- 方程的解数
- 1186 -- 方程的解数
- 方程的解数
- [NOI2001]方程的解数
- 1436 方程的解数
- 方程的解数(difficult)
- 计蒜客 方程的解数
- 【noi2001】方程的解数
- PKU 1186 方程的解数
- POJ 1186 方程的解数
- hoj 1372 方程的解数
- poj 1186 方程的解数
- poj 1186:方程的解数
- POJ 1186 方程的解数
- SSL_1227_方程的解数_dfs_hash
- kotlin开发Android入门篇四接口的创建和使用
- 详解手机注册验证码操作思路与流程
- Java的常见类
- pymongo使用总结
- 织梦DedeTag Engine Create File False的彻底解决方法总汇
- poj1186——方程的解数
- -Xdebug 启动命令
- Android WebView 总结 —— 硬件加速使用HTML5播放视频及全屏方案
- 应用系统架构设计
- Csdn修改账户手机绑定问题
- Lintcode:整数排列
- python基础——装饰器
- uloop
- HP-Socket v5.1.1 for Windows