[NOIp 2014]解方程
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]解方程相关推荐
- NOIP 2014 解方程
描述 已知多项式方程: a0+a1x+a2x2+...+anxn=0 求这个方程在[1, m]内的整数解(n 和 m 均为正整数). 格式 输入格式 输入共 n+2 行. 第一行包含 2 个整数 n. ...
- [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 ...
- 洛谷 题解 P2312 【解方程】
Problem P2312 [解方程] >>> record 用时: 1166ms 空间: 780KB(0.76MB) 代码长度: 2.95KB 提交记录: R9909587 > ...
- python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程
前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...
- java2的7次方怎么表示_python编程解方程第二弹:10行代码解二次方程(纯字符)...
用纯字符串格式来记录二次方程: '3x^2-10x-8=0' 'x^2-2x+1=0' '3x^2+14x+8=0' 'x^2=9' 二次方怎么表示呢?比如上面的^表示法,或者是python风格的** ...
- 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】
3751: [NOIP2014]解方程 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4856 Solved: 983 [Submit][Stat ...
- 10.24T3 解方程 取模意义下运算+秦九韶算法
#1228 解方程 描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入 输入共n + 2 行. 第一行包含2 ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 重根迭代法解方程(两种方法)(Python实现)
简述 通过两种不同的重根迭代的来解方程. 处理的方程是 (sin(x) - x/2) ^2 = 0 代码 采用的第一种迭代重根迭代方法: xk+1=xk−mf(xk)f′(xk)xk+1=xk−mf( ...
- 【PC工具】如何简单粗暴无脑的解方程
都2020年了(二十一世纪快中叶了): 信息时代这么多年了,已经进入云计算时代了: 电脑都会下围棋了: 火箭都能回收了: ... 那么 问题就来了:我们是不是还要用手解方程呢?电脑能不能给爷(我)解方 ...
最新文章
- mysql数据库批量编码_MySQL批量修改数据库的编码类型
- Android开源框架源码鉴赏:VirtualAPK
- sklearn 主成分分析法 PCA和IPCA
- php 将多个数组 相同的键重组,PHP – 合并两个类似于array_combine但具有重复键的数组...
- Sublime Text 3使用技巧总结--快捷键及常用插件
- Bytom国密网说明和指南
- 血淋淋的教训—将Vue项目打包成app的跨域问题
- ssis高级转换任务—查找_SSIS中的模糊查找转换
- 期货市场技术分析05_交易量和持仓兴趣
- 鼠标右键添加新建类型
- 使用java获取网络响应内容--Get请求方式
- 南阳oj-----Binary String Matching(string)
- MATLAB | 老版本也能用,默认设置让简单的代码画出炫酷的图像
- linux ubuntu 加密狗,ubuntu – 将usb加密狗连接到KVM VM
- 李开复:几年内电子商务上市潮会来临
- 从产业图谱看中国2020年数据智能行业的发展态势
- Ansys/Abaqus/nbsp;热应力分析.20…
- 【CVPR2020】Designing Network Design Spaces
- c++中opencv对图片旋转镜像并调整尺寸显示
- 2004年秋浙江省计算机等级考试二级C 编程题(2)
热门文章
- android studio调用so方法,android studio中的so库调用
- 中兴路由器,交换机DHCP原理,dhcp配置,实例
- 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
- RabbitMQ虚拟主机
- 03_跳转sucess方法和error方法
- 计算机安全的最后一道防线,网络安全的第一道防线是(图文)
- python上位机实现机械臂拾物
- 实时获取Android手机CPU占用率
- MindManager 2018如何新建维恩图
- 流水灯电路设计实验--VHDL