【NOI2001】方程的解数 题解(dfs+哈希)
题目描述
已知一个方程 k1*x1^p1+k2*x2^p2……+kn*xn^pn=0。
求解的个数。其中1<=x<=150,1<=p<=6;
答案在int范围内
输入格式
第一行一个正整数 n,表示未知数个数。
第二行一个正整数 m。 接下来 nnn 行,每行两个整数ki,pi
输出格式
输出一行一个整数,表示方程解的个数。
-----------------------------------------------------------------------------------------
思路:dfs是对的。但150^6的复杂度会TLE。
我们可以折半搜索,让复杂度变成2*(150^3) ,搜出来的结果用哈希存。这样就可以过了。
哈希是个大常数,要控制好范围。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,p[],k[],n1,n2,ans;
unsigned long long poww[][];
int t[],cnt1,cnt2,table[];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
int hashh(int x)
{
int y=abs(x)%;
while(t[y]&&table[y]!=x){
y++;
if (y==) y=;
}
return y;
}
void dfs1(int now,int sum)
{
if (now>(n>>)){int v=hashh(sum);t[v]++;table[v]=sum;return;}
for (int i=;i<=m;i++) dfs1(now+,sum+k[now]*poww[i][p[now]]);
}
void dfs2(int now,int sum)
{
if (now>n){ans+=t[hashh(sum)];return;}
for (int i=;i<=m;i++) dfs2(now+,sum-k[now]*poww[i][p[now]]);
}
signed main()
{
n=read();m=read();
memset(poww,,sizeof(poww));
for(int i=;i<=;i++)
for (int j=;j<=;j++) poww[i][j]=poww[i][j-]*i;
for (int i=;i<=n;i++) k[i]=read(),p[i]=read();
dfs1(,);dfs2((n>>)+,);
printf("%d",ans);
return ;
}
//19260817保我!
【NOI2001】方程的解数 题解(dfs+哈希)的更多相关文章
- cogs 304. [NOI2001] 方程的解数(meet in the middle)
304. [NOI2001] 方程的解数 ★★☆ 输入文件:equation1.in 输出文件:equation1.out 简单对比时间限制:3 s 内存限制:64 MB 问题描述 已 ...
- NOI2001 方程的解数
1735 方程的解数 http://codevs.cn/problem/1735/ 2001年NOI全国竞赛 时间限制: 5 s 空间限制: 64000 KB 题目描述 Descripti ...
- P5691 [NOI2001]方程的解数
题意描述 方程的解数 求方程 \(\sum_{i=1}^{n}k_ix_i^{p_i}=0(x_i\in [1,m])\) 的解的个数. 算法分析 远古 NOI 的题目就是水 类似于这道题. 做过这道 ...
- NOI2001 方程的解数(双向搜索)
solution 一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中.这样我们只要匹配两个队列中相同的元 ...
- 计蒜客 方程的解数(DFS)
问题描述 输出格式 输出一行,输出一个整数,表示方程的整数解的个数. 样例输入 - 样例输出 #include <stdio.h> #include <string.h> #i ...
- 计蒜客 方程的解数 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 \] 要求所有的 \( ...
- POJ 1186 方程的解数
方程的解数 Time Limit: 15000MS Memory Limit: 128000K Total Submissions: 6188 Accepted: 2127 Case Time ...
- [折半搜索][哈希]POJ1186方程的解数
题目传送门 这道题明显N数据范围非常小,但是M很大,所以用折半搜索实现搜索算法的指数级优化,将复杂度优化到O(M^(N/2)). 将搜出的两半结果用哈希的方式合并(乘法原理). Code: #incl ...
随机推荐
- Spring Boot读取配置文件的几种方式
Spring Boot获取文件总的来说有三种方式,分别是@Value注解,@ConfigurationProperties注解和Environment接口.这三种注解可以配合着@PropertySou ...
- Typora上传图片设置
Typora上传图片设置 问题 使用Typora写文档时上传图片的路径默认是本地磁盘的路径,这样就导致一个问题,当写好的文档上传到blog.csdn等博客网站时,会导致图片失效无法识别的问题. 解决方 ...
- Java面向对象详解-下
一. static static:静态的,可以用来修饰属性.方法.代码块(或初始化块).内部类 static修饰属性(类变量): 由类创建的所有的对象,都共用这一个属性 当其中一个对象对此属性进行修改 ...
- JavaScript学习 Ⅱ
五. JavaScript 数据类型 JavaScript 变量能够保存多种数据类型:数值.字符串值.数组.对象等等: var length = 7; // 数字 var lastName = &qu ...
- java 面向对象(十七):单元测试方法
* Java中的JUnit单元测试 * * 步骤: * 1.中当前工程 - 右键择:build path - add libraries - JUnit 4 - 下一步 * 2.创建Java类,进行单 ...
- scrapy 源码解析 (一):启动流程源码分析(一)命令行启动
前言 虽然爬虫的入门级编写并不难,但要让爬虫真正稳定可靠的运行起来,真不是一件容易的事.首先,要用到scrapy,就必须要读懂scrapy这个爬虫框架,如果连这个框架的执行逻辑都搞不懂,那么爬虫也很难 ...
- .net core微服务——gRPC(下)
序 上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难? 今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通信.只是作为dem ...
- 用python批量处理Excel表格,处理结果又快又好,做办公室最靓的那个仔
使用python批量处理Excel数据 让你根据Excel上所有人的身份证号码,提取出公司员工的生日 让你每个月都将公司所有人的考勤数据整理一下 类似这样的格式化的重复操作,你还在每次都使用的 ...
- Ethical Hacking - NETWORK PENETRATION TESTING(23)
Detecting ARP Posionning Attacks ARP main security issues: 1. Each ARP requests/response is trusted. ...
- Ethical Hacking - NETWORK PENETRATION TESTING(5)
Deauthentication Attacks Theory This attack is used to disconnect any device from any network within ...