[ 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 ...
随机推荐
- nginx: [emerg] unknown directive "聽" in D:\software03\GitSpace\cms\nginx-1.14.0/conf/nginx.conf:36
nginx: [emerg] unknown directive "聽" in D:\software03\GitSpace\cms\nginx-1.14.0/conf/nginx ...
- 用JQ实现基础的添加,插入,删除功能。
在eclipse里面运行代码即可,如果您是其他应用,请选择对您有帮助的代码即可,如果有写错或不懂的地方请联系QQ:1633420056,谢谢,祝学习进步 <!DOCTYPE html>&l ...
- 【前端】JavaScript继承实现的四种方式
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/4770235.html 一.继承的实现方法 1.原型链继承 这个继承最为简单,它的实现原理是,每一个AO对象都有一 ...
- 中国第二代身份证验证js代码
以下这部分代码截取自盛大的某个网页.详细我就不给url了.以下是相应的js代码: iW = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); iSum ...
- 关注PHPthinking官网微信公众号——红包来袭
欢迎大家扫描关注PHPthinking官方微信订阅号,我们将给您定期发送质量博文.新闻趣事.站点公告等等,同一时候还有PHPthinking准备的每日微信红包(金额不等,已发出百元红包)等着你! 官网 ...
- Estimating duration from bitrate, this may be inaccurate
通过 ffmpeg 获取 媒体 播放时长 ./ffmpeg-linux64-v3.3.1 -i /tmp/mp30001.mp3 ffmpeg version N-86111-ga441aa90e8 ...
- H264 介绍[1]
频编解码技术有两套标准,国际电联(ITU-T)的标准H.261.H.263.H.263+等:还有ISO 的MPEG标准Mpeg1.Mpeg2.Mpeg4等等.H.264/AVC是两大组织集合H.263 ...
- 美国诚实签经验——中英文行程单、往返机票、用英语面试的申请者通过率>用中文面试的申请者的通过率、一直保持着微笑,看上去很自信,也很诚恳、户口簿带上最好
在排队等待时据我的观察,用英语面试的申请者通过率>用中文面试的申请者的通过率.一家人申请通过率>单个人通过率:商务签证通过率>旅游签证通过率 一. 面签材料 1. 必备材 ...
- mac 下idea光标问题
可以使用 fn + i 解决此问题
- android中设置控件获得焦点
android中,要使控件获得焦点,需要先setFocus,再requestFocus. 以Button为例: btn.setFocusable(true); ...