【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 ...
随机推荐
- Dynamics CRM Data Encrytion error
Dynamics CRM有两个Database,一个Content DB——xxxx_MSCRM,一个Config DB——MSCRM_CONFIG. 当Content DB从其他环境Restore回 ...
- scala 数据结构(四):列表 List
1 列表 List-创建List 基本介绍 Scala中的List 和Java List 不一样,在Java中List是一个接口,真正存放数据是ArrayList,而Scala的List可以直接存放数 ...
- 数据可视化之powerBI基础(一) 如何查看PowerBI图表背后的数据
https://zhuanlan.zhihu.com/p/64405494 图表很直观,但有时候我们不仅想看图,也想更进一步查看生成该图表的明细数据,在PowerBI中有三种方式. (一)在图表上单击 ...
- 数据可视化之分析篇(一)使用Power BI进行动态帕累托分析
https://zhuanlan.zhihu.com/p/57763423 通过简单的点击交互,就能进行动态分析发现见解,才是我们需要的,恰好这也是 PowerBI 所擅长的. 就帕累托分析来说,能从 ...
- vue 仿掘金评论列表
先来个最终效果 代码: template代码: <template> <div class="main"> <div class="titl ...
- 循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理
在前面随笔<循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理>中介绍了用户管理模块的内容,包括用户列表的展示,各种查看.编辑.新增对话框的界面处理和后台数据处 ...
- git本地创建分支,并提交到github上去
很多时候,我们再开发的时候需要分支. 那么怎么在本地创建分支,并提交到github或者是远程仓库中呢? 其实很简单: 第一步: git checkout -b dev 创建新的分支 第二步: ...
- 题解 UVA1193 Radar Installation
原题 PDF OJ 思路 分析 因为半径d已经确定,所以对于每个点,我们可以算出它在x 轴上的覆盖位置线段LR,如图. 此问题便转为: 对于 n 个区间,每个区间内至少有1个点,求最少点数. 算法 我 ...
- 7.20试机测 T3 阶乘之和 暴力AC题解
7.20试机测 T3 阶乘之和 暴力AC题解 题外话:此乃本蒟蒻发表的第一篇题解,大家多多关照,支持一下,谢谢 题面 3.阶乘之和(sum.pas/in/out) 问题描述: 给定一个非负整数 n, ...
- nmap加快扫描速度(转载)
实测有效 nmap -sS -Pn -p 80 -n --open --min-hostgroup 1024 --min-parallelism 10 --host-timeout 30 -T4 -v ...