NOI2001 方程的解数(双向搜索)

solution
一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中。这样我们只要匹配两个队列中相同的元素即可使方程为零。方法:将两个队列排序,用尺取法+乘法原理扫一遍即可。
=>
code:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int ans;
int n,m,l,t1,t2;
int k[7],p[7];
int a[3500001];
int b[3500001];
inline int qr(){
	char ch;int sign=1;
	while((ch=getchar())<'0'||ch>'9')
		if(ch=='-')sign=-1;
	int res=ch^48;
	while((ch=getchar())>='0'&&ch<='9')
		res=res*10+(ch^48);
	return res*sign;
}
inline int fast(int x,int y){
	int res=1;
	while(y){
		if(y&1)res*=x;
		x*=x; y>>=1;
	}return res;
}
inline void dfs(int t,int tot){
	if(t>l){a[++t1]=-tot;return ;}
	for(rg i=1;i<=m;++i)
		dfs(t+1,tot+k[t]*fast(i,p[t]));
}
inline void dfs2(int t,int tot){
	if(t>n){b[++t2]=tot;return ;}
	for(rg i=1;i<=m;++i)
		dfs2(t+1,tot+k[t]*fast(i,p[t]));
}
int main(){
	//freopen("equation.in","r",stdin);
	//freopen("equation.out","w",stdout);
	n=qr(),m=qr();l=n/2;
	for(rg i=1;i<=n;++i)
		k[i]=qr(),p[i]=qr();
	dfs(1,0); dfs2(l+1,0);
	sort(a+1,a+t1+1);
	sort(b+1,b+t2+1);
	for(rg i=1,j=1,su,x,y;i<=t1;++i){
		if(a[i]<b[j])continue;
		while(b[j]<a[i]&&j<=t2)++j;
		if(j>t2)break;
	    if(a[i]==b[j]){
			su=a[i]; x=y=0;
			while(a[i]==su&&i<=t1)++i,++x;
			while(b[j]==su&&j<=t2)++j,++y;
			ans+=x*y;--i;
		}
	}
	printf("%d\n",ans);
	return 0;
}
												
											NOI2001 方程的解数(双向搜索)的更多相关文章
- cogs 304. [NOI2001] 方程的解数(meet in the middle)
		
304. [NOI2001] 方程的解数 ★★☆ 输入文件:equation1.in 输出文件:equation1.out 简单对比时间限制:3 s 内存限制:64 MB 问题描述 已 ...
 - P5691 [NOI2001]方程的解数
		
题意描述 方程的解数 求方程 \(\sum_{i=1}^{n}k_ix_i^{p_i}=0(x_i\in [1,m])\) 的解的个数. 算法分析 远古 NOI 的题目就是水 类似于这道题. 做过这道 ...
 - NOI2001 方程的解数
		
1735 方程的解数 http://codevs.cn/problem/1735/ 2001年NOI全国竞赛 时间限制: 5 s 空间限制: 64000 KB 题目描述 Descripti ...
 - POJ 1186 方程的解数
		
方程的解数 Time Limit: 15000MS Memory Limit: 128000K Total Submissions: 6188 Accepted: 2127 Case Time ...
 - 计蒜客 方程的解数 dfs
		
题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...
 - [ NOI 2001 ] 方程的解数
		
\(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...
 - 【NOI2001】方程的解数 题解(dfs+哈希)
		
题目描述 已知一个方程 k1*x1^p1+k2*x2^p2……+kn*xn^pn=0. 求解的个数.其中1<=x<=150,1<=p<=6; 答案在int范围内 输入格式 第一 ...
 - 【poj1186】 方程的解数
		
http://poj.org/problem?id=1186 (题目链接) 题意 已知一个n元高次方程: 其中:x1, x2,…,xn是未知数,k1,k2,…,kn是系数,p1,p2,…pn是指数 ...
 - [Swust OJ 166]--方程的解数(hash法)
		
题目链接:http://acm.swust.edu.cn/problem/0166/ Time limit(ms): 5000 Memory limit(kb): 65535 有如下方程组: A1 ...
 
随机推荐
- Python与rrdtool的结合模块
			
rrdtool(round robin database)工具为环状数据库的存储格式,round robin是一种处理定量数据以及当前元素指针的技术.rrdtool主要用来跟踪对象的变化情况,生成这些 ...
 - iOS之Block总结以及内存管理
			
block定义 struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(v ...
 - 各小组Alpha版项目发布作品点评
			
第一组:新蜂小组 题目:俄罗斯方块 评论:主体功能已经完成,可以流畅的进行游戏,游戏素材都是由贴图美化过的,期待计分系统等的完善. 第二组:天天向上 题目:连连看 评论:核心功能完成,可以流畅的进行游 ...
 - C# 妈妈再打我一下生成器
			
设计背景 网上很火的一个"妈妈再打我一下"的漫画图片,给了网友无限的想象发挥空间,此小程序可以给图片添加配文的形式,快速生成图片 设计思路 GDI+ 绘图技术,在图片基础上添加文字 ...
 - 清华集训2015-Day 1
			
玛里苟斯 一个大小为 \(n\) 的可重集合 \(a\) ,求 \(\mathbb E[x^k]\) ,其中 \(x\) 为 \(a\) 的一个子集的异或和. \(n\le 10^5,1\le k\l ...
 - 【BZOJ1032】[JSOI2007]祖玛(动态规划)
			
[BZOJ1032][JSOI2007]祖玛(动态规划) 题面 BZOJ 洛谷 题解 听说是道假题,假的原因是因为出题人可能没有考虑到祖玛的骚套路,比如可以先打几个球进去再一波消掉.也就是出题人基本默 ...
 - 前端学习 -- Css -- overflow
			
子元素默认是存在于父元素的内容区中,理论上讲子元素的最大可以等于父元素内容区大小.如果子元素的大小超过了父元素的内容区,则超过的大小会在父元素以外的位置显示,超出父元素的内容,我们称为溢出的内容.父元 ...
 - 开发常用镜像资源替换为国内开源镜像(yum,compose,maven,docker,android sdk,npm,国内开源镜像汇总)
			
一.国内开源镜像站点汇总 阿里云开源镜像站 (http://mirrors.aliyun.com/)网易开源镜像站 (http://mirrors.163.com/)中国科学技术大学开源镜像站 (ht ...
 - bzoj 1824: [JSOI2010]下棋问题
			
考虑每次新放一个棋子会产生多少新的矩形,以及减掉多少旧的矩形. 用第$i$个点的坐标把坐标轴分成4个象限. 显然第一问的答案用四个单调栈就能解决. 而且第二问每个矩形的两个端点一定在1,3或2,4象限 ...
 - [APIO2018] Duathlon 铁人两项
			
不经过重点,考虑点双 点双,考虑圆方树 两个点s,t,中间路径上,所有点双里的点都可以经过,特别地,s,t作为割点的时候,不能往后走,也就是不能经过身后的方点 也就是,(s,t)经过树上路径上的所有圆 ...