题目描述

已知一个方程 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+哈希)的更多相关文章

  1. cogs 304. [NOI2001] 方程的解数(meet in the middle)

    304. [NOI2001] 方程的解数 ★★☆   输入文件:equation1.in   输出文件:equation1.out   简单对比时间限制:3 s   内存限制:64 MB 问题描述 已 ...

  2. NOI2001 方程的解数

    1735 方程的解数 http://codevs.cn/problem/1735/ 2001年NOI全国竞赛  时间限制: 5 s  空间限制: 64000 KB     题目描述 Descripti ...

  3. P5691 [NOI2001]方程的解数

    题意描述 方程的解数 求方程 \(\sum_{i=1}^{n}k_ix_i^{p_i}=0(x_i\in [1,m])\) 的解的个数. 算法分析 远古 NOI 的题目就是水 类似于这道题. 做过这道 ...

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

    solution 一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中.这样我们只要匹配两个队列中相同的元 ...

  5. 计蒜客 方程的解数(DFS)

    问题描述 输出格式 输出一行,输出一个整数,表示方程的整数解的个数. 样例输入 - 样例输出 #include <stdio.h> #include <string.h> #i ...

  6. 计蒜客 方程的解数 dfs

    题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...

  7. [ NOI 2001 ] 方程的解数

    \(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...

  8. POJ 1186 方程的解数

    方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 6188   Accepted: 2127 Case Time ...

  9. [折半搜索][哈希]POJ1186方程的解数

    题目传送门 这道题明显N数据范围非常小,但是M很大,所以用折半搜索实现搜索算法的指数级优化,将复杂度优化到O(M^(N/2)). 将搜出的两半结果用哈希的方式合并(乘法原理). Code: #incl ...

随机推荐

  1. java 基本语法(十九)Optional类的使用

    java.util.Optional类1.理解:为了解决java中的空指针问题而生!Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值, ...

  2. freeMarker随手笔记

    freemarker官网:http://docs.freemarker.cn/ 注意: 1.如果标签没有嵌套内容(在开始标签和结束标签之间的内容),那么可以只使用开始标签 (详情:http://fre ...

  3. Unity3D+Post Processing Stack V2自定义后处理效果研究

    背景 众所周知,Unity3D支持自定义后处理效果,实现过程有三步: 添加着色器,在着色器里书写后处理代码: 添加材质,把材质和着色器绑定: 给相机添加脚本,重写其OnRenderImage方法,将材 ...

  4. Spring Boot 2.x基础教程:EhCache缓存的使用

    上一篇我们学会了如何使用Spring Boot使用进程内缓存在加速数据访问.可能大家会问,那我们在Spring Boot中到底使用了什么缓存呢? 在Spring Boot中通过@EnableCachi ...

  5. IDEA JRebel热部署( IDEA版本是2020.1.2)

    1.安装JRebel插件 在IDEA->Settings->plugins先安装JRebel插件: 2.下载工具 安装好JRebel后,找到lanyus大神文章中写的git地址:http: ...

  6. 题解 P1484 种树

    题目 传送门 cyrcyr今天在种树,他在一条直线上挖了 n 个坑. 这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树. 而且由于cyrcyr的树种不够,他至 ...

  7. Teambition如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  Teambition如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1 ...

  8. python3的字符串常用方法

    find()# 方法 find()# 范围查找子串,返回索引值,找不到返回-1 # 语法 s.find(substring, start=0, end=len(string)) # 参数 # subs ...

  9. .net core 使用 Serilog 作为日志提供者

    nuget引入 Serilog.AspNetCore Startup构造函数: public Startup(IConfiguration configuration) { Configuration ...

  10. js 绑定的键盘事件

    在全局绑定键盘事件 document.onkeydown = function(event){        //在全局中绑定按下事件 var e  = event  ||  window.e; va ...