题目大意:给定高次方程an*x^n+...+a1*x^1+a0*x^0=0 求[1,m]区间内有多少个整数根

ai<=10^10000。m<=100W

懒得高精,考场上写的long double乱搞……30分打底50分顶天QAQ

当我最终搞定了各种非官方数据之后,我仅仅能长跪大地。手捧鲜花。仰望上苍高喊:哈希大法好!

首先阿贝尔在200年前告诉我们 五次以上方程没有求根公式 于是我们仅仅能枚举1~m 这个是100W

然后100W再加上1W位的精度 都不用运算直接就是跪…… 怎么办呢QAQ

哈希大法好!

令f(x)=an*x^n+...+a1*x^1+a0*x^0 易知若f(x)=0 则f(x) mod p=0

反之假设f(x) mod p=0 那么我们基本能够得出f(x)=0 p比較靠谱的时候碰撞率极低

所以我们把全部的ai都对p取模 然后对于每一个解O(n)验证就可以

这样是O(m*n)的 能够拿到70分 p比較靠谱的话不会挂

那么100分怎么办呢?

哈希大法好!

我们非常easy就会发现f(x+p) mod p=f(x) mod p

于是我们选择一个小一些的p。预处理出0~p-1全部的f(x),然后超过p的取模就可以

可是p不够大会挂啊!

于是我们多选择几个p 分别取一遍mod 仅仅有一个值对全部的p取模之后全都0才算作解

哈希大法好!

Hash Killer III至今无人AC就是在证明这个算法的正确性!

哈希万岁!哈希赛高!

哈希万年推!

时间复杂度O(nΣp+m) 当中Σp是选择的全部质数之和 一般选择1W左右的质数即可了

不知道为什么无论考场上拿了多少分仅仅要回来把题切了就算做精神AC了0.0……

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 110
using namespace std;
typedef long long ll;
const int prime[]={10007,11261,14843,19997,21893};
int n,m,stack[1001001],top;
ll a[M][5],f[21893][5];
inline ll F(int x,int j)
{
int i;
ll re=0;
for(i=n;~i;i--)
re=(re*x+a[i][j])%prime[j];
return re;
}
inline void Input(int x)
{
static char s[10100];
int i,j;
bool flag=false;
scanf("%s",s+1);
for(i=1;s[i];i++)
{
if(s[i]=='-')
flag=true;
else
for(j=0;j<5;j++)
a[x][j]=( (a[x][j]<<1) + (a[x][j]<<3) + s[i]-'0' )%prime[j];
}
if(flag)
for(j=0;j<5;j++)
a[x][j]=prime[j]-a[x][j];
}
int main()
{
int i,j;
cin>>n>>m;
for(i=0;i<=n;i++)
Input(i); for(j=0;j<5;j++)
for(i=0;i<prime[j];i++)
f[i][j]=F(i,j); for(i=1;i<=m;i++)
{
for(j=0;j<5;j++)
if(f[i%prime[j]][j])
break;
if(j==5)
stack[++top]=i;
} cout<<top<<endl;
for(i=1;i<=top;i++)
printf("%d\n",stack[i]);
}

NOIP 2014 D2T3 解方程 Hash大法好的更多相关文章

  1. NOIp 2014 #5 解方程 Label:数论?

    题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...

  2. 【UOJ #20】【NOIP 2014】解方程

    http://uoj.ac/problem/20 并不会做...然后看题解....... 对a取模,避免了高精度带来的复杂度,然后再枚举x判断是否满足模意义下等于0. 取5个模数,我直接抄的别人的_( ...

  3. 解方程(hash,秦九韶算法)

    题目描述 已知多项式方程: a0+a1x+a2x2+⋯+anxn=0 求这个方程在 [1,m]内的整数解(n 和 m 均为正整数). 输入输出格式 输入格式: 共 n+2 行. 第一行包含 2个整数 ...

  4. LOJ2503 NOIP2014 解方程 【HASH】

    LOJ2503 NOIP2014 解方程 LINK 题目大意就是给你一个方程,让你求[1,m]中的解,其中系数非常大 看到是提高T3还是解方程就以为是神仙数学题 后来研究了一下高精之类的算法发现过不了 ...

  5. luogu2312 解方程 (数论,hash)

    luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...

  6. vijos P1915 解方程 加强版

    背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...

  7. [NOIP2014]解方程

    3732 解方程  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 输入描述 Input Descrip ...

  8. 洛谷 P2312 解方程

    题目 首先,可以确定的是这题的做法就是暴力枚举x,然后去计算方程左边与右边是否相等. 但是noip的D2T3怎么会真的这么简单呢?卡常卡的真是熟练 你需要一些优化方法. 首先可以用秦九韶公式优化一下方 ...

  9. Hash大法

    内容参考<算法竞赛进阶指南> 之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分. hash涉及内容很多,这里只讨论字符串hash 可 ...

随机推荐

  1. Python之threading多线程

    1.threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) ...

  2. nyoj 题目12 喷水装置(二)

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  3. hibernate级联查询映射的两种方式

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  4. Mysql实战之高可用HMA

    author:JevonWei 版权声明:原创作品 主节点高可用 MHA是一款开源的MySQL的高可用程序,他为MySQL主从复制架构提供了automating master failover功能.M ...

  5. js 判断对象类型

    在企业级的开发中,我们常用 typeof 来判断企业 对象类型:但是 typeof 不能判断 Array 和 null 这里我们使用一个 原型上的 toString方法:请看一下代码: <scr ...

  6. [POJ3352]Road Construction

    [POJ3352]Road Construction 试题描述 It's almost summer time, and that means that it's almost summer cons ...

  7. [SDOI2009][bzoj1877] 晨跑 [费用流]

    题面: 传送门 思路: 一个点只能走一回,路径不能相交...... 显然可以转化为网络流的决策来做 我们构建一个网络,令其最大流等于最大的跑步天数即可 怎么构造呢? 对于每个点只能走一次的限制,可以考 ...

  8. qw

    // 主页 @RequestMapping(value = "/home") public ModelAndView home() { ModelAndView MV = new ...

  9. 如何将RobotFramework中case的执行结果上传到TestLink中。

    公司的需求是: 用RobotFrameworjk框架执行case,用Testlink管理case和测试任务.需要持续统计每个版本的测试结果. 我觉得用Jenkins+Robot也行,Testlink+ ...

  10. Codeforces Round #364 (Div. 2) C 二分处理+求区间不同字符的个数 尺取法

    C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...