[ NOI 2001 ] 方程的解数
\(\\\)
\(Description\)
已知一个 \(N\) 元高次方程:
\]
要求所有的 \(x_i\) 取值范围为\([1,m]\)且为整数,求方程的解数。
- \(n\le 6,m\le 150\)
\(\\\)
\(Solution\)
发现 \(150^6\) 复杂度爆炸,自然能想到折半搜。
先搜前一半的所有可能的答案,存进哈希表里,然后搜后一半的答案,在哈希表里查相反数,如果存在就累加上个数。
然后 \(map\) 就被卡 \(T\) 了。其实这篇题解是哈希表学习笔记......
哈希表可以理解为一种类似多头链表的结构。当答案很大但是答案的个数并不是很多的时候选择。
每次得到一个答案先将他缩小在\([1,mod]\)范围内,然后查询这个值是否有存储过,如果有就累加计数器。
如果没有的话操作就很有意思了。考虑到可能会有多个数经过模运算得到的答案相同,所以不能直接在模运算所得答案处存储这个数,而要像邻接表一样,由这个答案向真正的数连一条边,边权就是个数。
然后查值得时候操作就和遍历邻接表一样了。因为模数选择质数,所以得到的答案分布还是很均匀的,单次查询和累加复杂度都接近\(\text O(1)\)。
\(\\\)
\(Code\)
#include<map>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define R register
#define gc getchar
#define mod 6893911
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
int n,m,t[10],k[10],ans;
struct hashtable{
int hd[mod+2],tot;
struct edge{int w,to,nxt;}e[4000000];
inline void add(int u,int v){
e[++tot].to=v; e[tot].w=1;
e[tot].nxt=hd[u]; hd[u]=tot;
}
inline int find(int x){
int tmp=(x%mod+mod)%mod;
if(!hd[tmp]) return -1;
for(R int i=hd[tmp],v;i;i=e[i].nxt)
if((v=e[i].to)==x) return e[i].w;
return -1;
}
inline void insert(int x){
int tmp=(x%mod+mod)%mod;
if(!hd[tmp]) add(tmp,x);
else{
for(R int i=hd[tmp],v;i;i=e[i].nxt)
if((v=e[i].to)==x){++e[i].w;return;}
add(tmp,x);
}
}
}s;
inline int qpow(int x,int t){
int res=1;
while(t){
if(t&1) res*=x;
x*=x; t>>=1;
}
return res;
}
void dfsl(int p,int sum){
if(p>n/2){s.insert(sum);return;}
for(R int i=1;i<=m;++i) dfsl(p+1,sum+k[p]*qpow(i,t[p]));
}
void dfsr(int p,int sum){
if(p>n){
int tmp=s.find(-sum);
if(tmp>0) ans+=tmp; return;
}
for(R int i=1;i<=m;++i) dfsr(p+1,sum+k[p]*qpow(i,t[p]));
}
int main(){
n=rd(); m=rd();
for(R int i=1;i<=n;++i) k[i]=rd(),t[i]=rd();
dfsl(1,0); dfsr(n/2+1,0);
printf("%d\n",ans);
return 0;
}
[ NOI 2001 ] 方程的解数的更多相关文章
- 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 的题目就是水 类似于这道题. 做过这道 ...
- 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 ...
- cogs 304. [NOI2001] 方程的解数(meet in the middle)
304. [NOI2001] 方程的解数 ★★☆ 输入文件:equation1.in 输出文件:equation1.out 简单对比时间限制:3 s 内存限制:64 MB 问题描述 已 ...
- 【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 ...
- NOI2001 方程的解数(双向搜索)
solution 一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中.这样我们只要匹配两个队列中相同的元 ...
- 计蒜客 方程的解数(DFS)
问题描述 输出格式 输出一行,输出一个整数,表示方程的整数解的个数. 样例输入 - 样例输出 #include <stdio.h> #include <string.h> #i ...
随机推荐
- Ext-js使用指南(总结)
一.获取元素(Getting Elements) 1.Ext.get var el = Ext.get('myElementId');//获取元素,等同于document.getElementById ...
- rsyslog trouble shooting
openstack,swift的log不输出了.trouble shooting过程 , 发现我们的程序 /var/log/swift/proxy.log等总是不输出log. 因为log rsyslo ...
- angular 的ui.router 定义不同的state 对应相同的url
Angular UI Router: Different states with same URL? The landing page of my app has two states: home-p ...
- OJ-online judegement
OJ-online judegement https://baike.baidu.com/item/OJ/8129019?fr=aladdin
- linux系统编程:线程同步-信号量(semaphore)
线程同步-信号量(semaphore) 生产者与消费者问题再思考 在实际生活中,仅仅要有商品.消费者就能够消费,这没问题. 但生产者的生产并非无限的.比如,仓库是有限的,原材料是有限的,生产指标受消费 ...
- C++之new和malloc差别
在C++程序猿面试中.非常easy被问到new 和 malloc的差别.偶尔在quora上逛.看到Robert Love的总结.才发现自己仅仅知道里面的一两项就沾沾自喜,从来没有像这位大牛一 ...
- 分布式数据库DDM Sidecar模式负载均衡
简介 1.分布式数据库中间件 DDM 分布式数据库中间件(Distributed Database Middleware)是解决数据库容量.性能瓶颈和分布式扩展问题的中间件服务,提供分库分表.读写分离 ...
- caioj1472: 后缀自动机1:多个串的LCS
子串母串跑合并答案 一个点的fail的dep是比任意一条根到这个点路径长度要小的. 那么改就可以直接来了. #include<cstdio> #include<iostream> ...
- 安装Node.js 以及命令行使用
安装 官方的安装包 安装完成之后,会自动添加到环境变量中 通过visual studio安装 命令行 查看版本 PS C:\Users\clu\Desktop> node --version v ...
- POJ 3100:Root of the Problem
Root of the Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12060 Accepted: 6 ...