Description

已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0

求这个方程在[1,m]内的整数解(n和m均为正整数)。
 

Input

第一行包含2个整数n、m,每两个整数之间用一个空格隔开。
接下来的n+1行每行包含一个整数,依次为a0,a1,a2,...,an。

Output

第一行输出方程在[1,m]内的整数解的个数。

接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,m]内的一个整数解。
 

Sample Input

2 10
2
-3
1

Sample Output

2
1
2

HINT

对于100%的数据,0<n≤100,|ai|≤1010000,an≠0,m≤1000000。

题解:

  到现在还是不怎么清楚正解到底是什么,大多数人应该都是选择了取模吧。但是这个明显是一种很不稳定的做法,很难保证复杂度和正确性两者兼得,也许事后可以AC,但是考试的时候谁能有足够的信心保证自己写对了呢?

  因为a数组的值极其之大,而m相对来说要小得多,所以可以考虑把结果取模,其实就像之前提到的字符串Hash一样,这是无法保证完美的正确性的,但是出现冲突的概率也是极小。这取决于你所取的模及其大小。

  也许最开始可以想到的就是取一个9位数的大模,这样是可以得70分的,也是相对稳妥的一种方法,时间复杂度为O(m * len),len表示a[i]的位数。如何减小复杂度?通过平时数学知识的了解,我们知道,设当前所取的模为MOD,若x = i时满足条件,则x + MOD必定也是满足的,所以我们可以把复杂度降到O(MOD + m)。

  这又有一个问题了,之前所取的模比len还要大一些的,那就不得不缩小MOD了。但是如果MOD过小的话,正确性更加无法保证。如同字符串Hash一样,我们也可以选择取多个模,当且仅当在所有模数情况下满足,这个数才满足。然而由于数不能过大,要找到真正合适的又能够不超时的(这里不说官方数据,官方数据比较水,但是BZOJ上的数据到现在我还是过不了),很难。

  所以在知道正解之前,我觉得这就是一道RP题啊。

代码(官方数据100分,BZOJ超时,Hash值来自hzwer)

---------------------------------------------------------------------------------------------------

#include <cstdio>
#include <cstring>

#define MAXN 105
#define MAXM 1000005

#ifdef WIN32
#define LLD "%I64d"
#else
#define LLD "%lld"
#endif

typedef long long ll;

const ll pri[5] = {11261, 19997, 22877, 21893, 14843};

ll max(ll a, ll b) { return a > b ? a : b; }

ll min(ll a, ll b) { return a < b ? a : b; }

ll n, m, a[5][MAXN], f[5][MAXM], l, ans[MAXM], x, tot;
char ch[MAXM];

ll calc(ll o, ll k)
{
  ll x = 1, res = 0;
  for (ll i = 0; i <= n; i++) (x *= o) %= pri[k], (res = x * a[k][i]) %= pri[k];
  return res == 0;
}

int main()
{
  freopen("3751.in", "r", stdin);
  freopen("3751.out", "w", stdout);
  scanf(LLD LLD, &n, &m);
  for (ll i = 0; i <= n; i++)
  {
    scanf("%s", ch), l = strlen(ch), x = ch[0] == '-';
    for (ll k = 0; k <= 4; k++)
      for (ll j = x ? 1 : 0; j <= l - 1; j++)
        (a[k][i] = (a[k][i] * 10) + ch[j] - '0') %= pri[k];
    if (x) for (ll k = 0; k <= 4; k++) a[k][i] = pri[k] - a[k][i];
  }
  for (ll k = 0; k <= 4; k++)
    for (ll i = 0; i < pri[k]; i++) f[k][i] = calc(i, k);
  for (int i = 1; i <= m; i++)
  {
    int get = 1;
    for (int k = 0; k <= 4; k++) if (!f[k][i % pri[k]]) { get = 0; break; }
    if (get) ans[++tot] = i;
  }
  printf(LLD "\n", tot);
  for (int i = 1; i <= tot; i++) printf(LLD "\n", ans[i]);
  return 0;
}

---------------------------------------------------------------------------------------------------

[BZOJ3751][NOIP2014] 解方程的更多相关文章

  1. [BZOJ3751] [NOIP2014] 解方程 (数学)

    Description 已知多项式方程:$a_0+a_1*x+a_2*x^2+...+a_n*x^n=0$ 求这个方程在[1,m]内的整数解(n和m均为正整数). Input 第一行包含2个整数n.m ...

  2. BZOJ3751 NOIP2014 解方程(Hash)

    题目链接  BZOJ3751 这道题的关键就是选取取模的质数. 我选了4个大概几万的质数,这样刚好不会T 然后统计答案的时候如果对于当前质数,产生了一个解. 那么对于那些对这个质数取模结果为这个数的数 ...

  3. [BZOJ3751][NOIP2014]解方程(数学相关+乱搞)

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

  4. 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程

    在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...

  5. 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】

    3751: [NOIP2014]解方程 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4856  Solved: 983[Submit][Status ...

  6. BZOJ 3751: [NOIP2014]解方程 数学

    3751: [NOIP2014]解方程 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3751 Description 已知多项式方程: ...

  7. LOJ2503 NOIP2014 解方程 【HASH】

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

  8. bzoj 3751: [NOIP2014]解方程 同余系枚举

    3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...

  9. bzoj3751 / P2312 解方程

    P2312 解方程 bzoj3751(数据加强) 暴力的一题 数据范围:$\left | a_{i} \right |<=10^{10000}$.连高精都无法解决. 然鹅面对这种题,有一种常规套 ...

随机推荐

  1. 简单PE类代码

    三个文件分别是类定义文件pefile.h;类实现文件pefile.cpp;类调用文件petype.cpp. #ifndef PE_FILE_H #define PE_FILE_H #include & ...

  2. python3的编码问题

    Python3对文本(str)和二进制数据(bytes)作了更为清晰的区分. 文本默认是以Unicode编码(python2默认是ascii),由str类型表示,二进制数据则由bytes类型表示. s ...

  3. kettle转换和作业插件开发及调试

    这是一篇几年前写下的文档,最近打算根据这篇文档重写一下kettle插件的教程.结果各种理由,一推再推.今天索性将这篇文档发布出来,分享给大家,例子等有空再补上.这是一篇基于kettle3.2基础上完成 ...

  4. cocos2d-js 学习笔记 --安装调试(2)

    对于初学者安装cocos2d-js的环境并没有教程中说的那么简单,至少笔者是这么认为的 第一步,下载cocos2d-js的SDK,(先别着急运行) 第二步,安装Cocos2d console ,(Ma ...

  5. css文件 引用后不起作用

    你如果填写的是相对路径,那么检查一下路径是否正确. 如果相对路径正确,那么有可能你的css样式的层级错误(概率也不低),比如说图片的引用路径发生了改变等等. 要看你预览的浏览器是什么,我经常遇到IE预 ...

  6. 关于httpd服务的安装、配置

    httpd是Apache超文本传输协议(HTTP)服务器的主程序.通常,httpd不应该被直接调用,而应该在linux系统中由 apachectl 调用.接下来我们将了解有关httpd服务的安装与配置 ...

  7. Sublime 3 如何设置xftp 排除文件夹“bower_components”,“node_modules”

    “bower_components”,“node_modules”这个文件夹,作为模块得引用文件,不需要下载本地进行编码,这里得文件非常多,若是不把这个两个文件夹排除掉掉话,通过xftp下载所有文件的 ...

  8. sgu 240 Runaway (spfa)

    题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...

  9. mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap

    这个错误基本都是mapper.xml有重复生成的代码

  10. oh my zsh

    简单使用oh my zsh 安装oh my Zsh 安装zsh 安装curl或者wget 下载并安装oh my zsh: curl 下载方式curl -L https://raw.github.com ...