【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 ...
随机推荐
- Python爬虫:手把手教你写迷你爬虫架构
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:我爱学Python 语言&环境 语言:继续用Python开路 ...
- Alink漫谈(十) :线性回归实现 之 数据预处理
Alink漫谈(十) :线性回归实现 之 数据预处理 目录 Alink漫谈(十) :线性回归实现 之 数据预处理 0x00 摘要 0x01 概念 1.1 线性回归 1.2 优化模型 1.3 损失函数& ...
- Python 字符串改变
在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...
- MYSQL 之 JDBC(四): 增删改查(二)通过ResultSet执行查询操作
/** * ResultSet:结果集.封装了使用JDBC进行查询的结果. * 1. 调用Statement对象的executeQuery(sql)方法 * 2. ResultSet返回的实际上就是一 ...
- Django适当进阶篇
本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效率最高的,今天就来基于下面的需求来继续学习Django 项 ...
- Elasticsearch备份数据
Elasticsearch备份数据 1.建立备份目录 POST _snapshot/my_backup/ { "type": "fs", "setti ...
- static关键字真能提高Bean的优先级吗?答:真能
生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...
- OSCP Learning Notes - Post Exploitation(1)
Linux Post Exploitation Target Sever: Kioptrix Level 1 1. Search the payloads types. msfvenom -l pay ...
- html-webpack-plugin在html中插入数据
html-webpack-plugin在html中插入数据 <!DOCTYPE html> <html> <head> <meta charset=" ...
- springboot application.yml配置学习
一.背景 为了更好的使用springboot,所以看一下application.yml配置这块.主要是看数据绑定这块. 主要参考:https://www.hangge.com/blog/cache/d ...