Description

已知多项式方程:

a0+a1x+a2x^2+..+anx^n=0

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

Input

输入文件名为equation .in。

输入共n + 2 行。

第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。

接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an

Output

输出文件名为equation .out 。

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

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

Sample Input1

2 10
1
-2
1

Sample Output1

1
1

Sample Input2

2 10
2
-3
1

Sample Output2

2
1
2

Sample Input3

2 10
1
3
2  

Sample Output3

0

Hint

对于30%的数据:0<n<=2,|ai|<=100,an!=0,m<100

对于50%的数据:0<n<=100,|ai|<=10^100,an!=0,m<100

对于70%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<10000

对于100%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<1000000

题解

30/50分算法:

1、直接枚举,注意要用高精度。

2、复杂度$O(m*n^3)$。

70分算法:

1、常识告诉我们这种方程求整数解不会有什么正经解法,有也不是联赛内容;

2、选$k$个质数$p$,并让系数都对$p$取模,然后把$1$到$m$一个个带入验证看是不是为$0$。如果对于一个$x$,在所有取模意义下都满足方程,我们就认为这个$x$是原方程的一个解;

3、一个模数不够就多取几个质数,一般取到$5$就可以了;

4、因为没有了高精度,所以复杂度为$O(m*n*s)$, $s$为质数个数。

100分算法:

1、 $70$分做法的基础上,发现模数$p$如果取得比较小,会有个有用的信息:$x$取值$x_0$的答案和取值$x_0+p$的答案是一样的;实际上基于一个模同余式引理: $f(x)≡0(mod p)$,则$f(x+p)≡0(mod p)$

2、所以我们只需要预处理出$x$取值$0$~$p-1$时候的答案,再枚举$1$~$m$就可以直接查询了。

 1 //It is made by Awson on 2017.9.21
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <queue>
 7 #include <stack>
 8 #include <string>
 9 #include <cstdio>
10 #include <vector>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define Min(a, b) ((a) < (b) ? (a) : (b))
16 #define Max(a, b) ((a) > (b) ? (a) : (b))
17 #define LL long long
18 using namespace std;
19 const int N = 100;
20 const int M = 1000000;
21 const int p[10] = {
22     1007, 10007, 12347, 12349, 100017, 111647, 19720308, 19750920, 19981117, 20150208
23 };
24
25 int n, m;
26 LL a[N+5][10];
27 bool vis[M+5];
28 int ans[M+5], cnt = 0;
29
30 void getdata(int x) {
31     char ch = N;
32     bool flag = 0;
33     while ((ch < '0' || ch > '9') && (ch != '-')) ch = getchar();
34     if (ch == '-') {
35         flag = 1;
36         ch = getchar();
37     }
38     while (ch >= '0' && ch <= '9') {
39         for (int i = 0; i < 10; i++) a[x][i] = (a[x][i]*10+ch-48) % p[i];
40         ch = getchar();
41     }
42     if (flag) for (int i = 0; i < 10; i++) a[x][i] *= -1;
43 }
44 bool check2(int x, int kk) {
45     LL v = a[n][kk];
46     for (int i = n-1; i >= 0; i--)
47         v = (v*x+a[i][kk])%p[kk];
48     if (v) {
49         int t = x;
50         while (t <= m) {
51             vis[t] = 1;
52             t += p[kk];
53         }
54         return false;
55     }
56     return true;
57 }
58 bool check(int x) {
59     if (vis[x]) return false;
60     for (int i = 0; i <10; i++)
61         if (!check2(x, i)) return false;
62     return true;
63 }
64 void work() {
65     for (int i = 0; i <= n; i++)
66         getdata(i);
67     for (int i = 1; i <= m; i++)
68         if (check(i)) ans[++cnt] = i;
69     printf("%d\n", cnt);
70     for (int i = 1; i <= cnt; i++)
71         printf("%d\n", ans[i]);
72 }
73
74 int main() {
75     while (~scanf("%d%d", &n, &m))
76         work();
77     return 0;
78 }

转载于:https://www.cnblogs.com/NaVi-Awson/p/7566889.html

[NOIp 2014]解方程相关推荐

  1. NOIP 2014 解方程

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

  2. [NOIp提高组2014]解方程

    题目大意 求方程 \[ \sum_{i=0}^{n}a_ix^i=0 \] 在\([1,m]\)内的整数解 \(1 \leq |a_i| \leq 10^{10000},a_i\neq 0,1 \le ...

  3. 洛谷 题解 P2312 【解方程】

    Problem P2312 [解方程] >>> record 用时: 1166ms 空间: 780KB(0.76MB) 代码长度: 2.95KB 提交记录: R9909587 > ...

  4. python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程

    前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...

  5. java2的7次方怎么表示_python编程解方程第二弹:10行代码解二次方程(纯字符)...

    用纯字符串格式来记录二次方程: '3x^2-10x-8=0' 'x^2-2x+1=0' '3x^2+14x+8=0' 'x^2=9' 二次方怎么表示呢?比如上面的^表示法,或者是python风格的** ...

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

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

  7. 10.24T3 解方程 取模意义下运算+秦九韶算法

    #1228 解方程 描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入 输入共n + 2 行. 第一行包含2 ...

  8. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  9. 重根迭代法解方程(两种方法)(Python实现)

    简述 通过两种不同的重根迭代的来解方程. 处理的方程是 (sin(x) - x/2) ^2 = 0 代码 采用的第一种迭代重根迭代方法: xk+1=xk−mf(xk)f′(xk)xk+1=xk−mf( ...

  10. 【PC工具】如何简单粗暴无脑的解方程

    都2020年了(二十一世纪快中叶了): 信息时代这么多年了,已经进入云计算时代了: 电脑都会下围棋了: 火箭都能回收了: ... 那么 问题就来了:我们是不是还要用手解方程呢?电脑能不能给爷(我)解方 ...

最新文章

  1. mysql数据库批量编码_MySQL批量修改数据库的编码类型
  2. Android开源框架源码鉴赏:VirtualAPK
  3. sklearn 主成分分析法 PCA和IPCA
  4. php 将多个数组 相同的键重组,PHP – 合并两个类似于array_combine但具有重复键的数组...
  5. Sublime Text 3使用技巧总结--快捷键及常用插件
  6. Bytom国密网说明和指南
  7. 血淋淋的教训—将Vue项目打包成app的跨域问题
  8. ssis高级转换任务—查找_SSIS中的模糊查找转换
  9. 期货市场技术分析05_交易量和持仓兴趣
  10. 鼠标右键添加新建类型
  11. 使用java获取网络响应内容--Get请求方式
  12. 南阳oj-----Binary String Matching(string)
  13. MATLAB | 老版本也能用,默认设置让简单的代码画出炫酷的图像
  14. linux ubuntu 加密狗,ubuntu – 将usb加密狗连接到KVM VM
  15. 李开复:几年内电子商务上市潮会来临
  16. 从产业图谱看中国2020年数据智能行业的发展态势
  17. Ansys/Abaqus/nbsp;热应力分析.20…
  18. 【CVPR2020】Designing Network Design Spaces
  19. c++中opencv对图片旋转镜像并调整尺寸显示
  20. 2004年秋浙江省计算机等级考试二级C 编程题(2)

热门文章

  1. android studio调用so方法,android studio中的so库调用
  2. 中兴路由器,交换机DHCP原理,dhcp配置,实例
  3. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
  4. RabbitMQ虚拟主机
  5. 03_跳转sucess方法和error方法
  6. 计算机安全的最后一道防线,网络安全的第一道防线是(图文)
  7. python上位机实现机械臂拾物
  8. 实时获取Android手机CPU占用率
  9. MindManager 2018如何新建维恩图
  10. 流水灯电路设计实验--VHDL