[ 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 ...
随机推荐
- springboot 关于第三方包 打包问题
第三方包: 添加library 依赖 在pom.xml中配置 <resources> <resource> <directory>lib</directory ...
- Servlet实现国际化
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/internationalization.html: 三个重要术语: 国际化(i18n):这意味着 ...
- NYOJ 题目42 一笔画问题(欧拉图)
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 zyc从小就比較喜欢玩一些小游戏.当中就包含画一笔画.他想请你帮他写一个程序.推断一个图是否可以用一笔画下 ...
- nodejs参考文章
http://www.cnblogs.com/lily1010/p/6683987.html https://manlili.github.io/2015/04/06/Node%E5%85%A5%E9 ...
- Android 智能问答机器人的实现
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38498353 ,本文出自:[张鸿洋的博客] 今天看到一个ios写的图灵机器人,直 ...
- 【bzoj2464】中山市选[2009]小明的游戏
直接转换成最短路 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstr ...
- 实时人工智能:微软发布Project Brainwave预览版 现场可编程门阵列(Field Programmable Gate Array,简称FPGA) 硬件设计可以迅速演进
https://mp.weixin.qq.com/s/bAPiPURZd-YsbV5PbzwpQQ 编者按:随着各大公司对于数据计算的要求越来越高,实时AI成为了研究者们关注的重点.在美国西雅图举行的 ...
- selenium iframe 定位 qq空间说说
selenium iframe 定位 qq空间说说
- Robot Framework 怎样写好Test Case
1.介绍 这是一个关于如何用Robot Framework写好Test Case的高层次的指导准则 怎样实际的与系统进行交互不在此文档范围内 最重要的准则是使测试用例尽可能的让熟悉此领域的人觉得简单易 ...
- C# winfrom TCP 服务端和客户端(链接)
1.C#Winform TCP 之服务端: 可以参考下面链接,比较好.第二个链接可以看看,提供了一个思路. http://www.cnblogs.com/guolebin7/archive/2013/ ...