解方程

解方程

三世轮回 提交于 2019-12-04 05:58:50
链接: https://ac.nowcoder.com/acm/problem/16499 来源:牛客网 题目描述 已知多项式方程: a 0 +a 1 x+a 2 x 2 +...+a n x n =0 求这个方程在[1, m]内的整数解(n和m均为正整数)。 输入描述: 第一行包含2个整数n、m,每两个整数之间用一个空格隔开。 接下来的n+1行每行包含一个整数,依次为a 0 ,a 1 ,a 2 ,……,a n 。 输出描述: 第一行输出方程在[1, m]内的整数解的个数。接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m]内的一个整数解。 示例1 输入 2 10 1 -2 1 输出 1 1 示例2 输入 2 10 2 -3 1 输出 2 1 2 示例3 输入 2 10 1 3 2 输出 0 备注: 对于30%的数据,0<n>i|≤100,a n ≠0,m≤100; 对于50%的数据,0<n>i|≤10100,a n ≠0,m≤100; 对于70%的数据,0<n>i|≤1010000,a n ≠0,m≤10000; 对于100%的数据,0<n>i|≤1010000,a n ≠0,m≤1000000。 解析: 我们考虑枚举m,对于每一个m,我们去检验它是否是多项式方程的一个解,检验的方法用到了秦九韶算法,秦九韶算法的作用就是求一个多项式方程的结果时,只需枚举n次

NOIP 2014 解方程

元气小坏坏 提交于 2019-12-03 07:24:24
洛谷 P2312 解方程 洛谷传送门 JDOJ 2890: [NOIP2014]解方程 D2 T3 JDOJ传送门 Description 已知多项式方程: a0+a1x+a2x2+⋯+anxn=0 求这个方程在[1, m]内的整数解( n和 m均为正整数)。 Input 输入共 n+2行。 第一行包含 2个整数 n、m,每两个整数之间用一个空格隔开。 接下来的 n+1行每行包含一个整数,依次为 a0,a1,a2,…,an。 Output 第一行输出方程在 [1, m]内的整数解的个数。 接下来每行一个整数,按照从小到大的顺序依次输出方程在 [1, m]内的一个整数解。 Sample Input Input I: 2 10 1 -2 1 Input II: 2 10 2 -3 1 Input III: 2 10 1 3 2 Sample Output Output I: 1 1 Output II: 2 1 2 Output III: 0 HINT 【数据说明】 对于 30%的数据,0< n ≤2, |ai|≤100,an≠0, m≤100; 对于 50%的数据,0< n ≤100,|ai| ≤10100,an≠0,m≤100; 对于 70%的数据,0< n ≤100,|ai| ≤1010000,an≠0,m≤10000; 对于 100%的数据,0< n ≤100,|ai|

洛谷 P2312 解方程 题解

荒凉一梦 提交于 2019-12-02 02:29:18
P2312 解方程 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 [1,m][1,m] 内的整数解( \(n\) 和 \(m\) 均为正整数)。 输入格式 输入共 $ n + 2$ 行。 第一行包含 \(2\) 个整数 \(n, m\) ,每两个整数之间用一个空格隔开。 接下来的 \(n+1\) 行每行包含一个整数,依次为 \(a_0,a_1,a_2\ldots a_n\) 。 输出格式 第一行输出方程在 [1,m][1,m] 内的整数解的个数。 接下来每行一个整数,按照从小到大的顺序依次输出方程在 [1,m][1,m] 内的一个整数解。 输入输出样例 输入 #1 2 10 1 -2 1 输出 #1 1 1 输入 #2 2 10 2 -3 1 输出 #2 2 1 2 输入 #3 2 10 1 3 2 输出 #3 0 说明/提示 对于 30%30% 的数据: \(0<n\le 2,|a_i|\le 100,a_n≠0,m<100\) 。 对于 50%50% 的数据: \(0<n\le 100,|a_i|\le 10^{100},a_n≠0,m<100\) 。 对于 70%70% 的数据: \(0<n\le 100,|a_i|\le 10^{10000},a_n≠0,m<10^4\) 。 对于 100%100% 的数据

AcWing - 515 - 解方程 = 简单数学

你说的曾经没有我的故事 提交于 2019-12-01 06:17:07
https://www.acwing.com/problem/content/517/ 给一个多项式,求他的整数根。 首先稳妥的办法应该是整一大堆质数,然后用中国剩余定理合并(当然不是真的合并)。 奇怪一点的就用几个就可以了,卡掉的概率极低,加上是OI其实没问题的。 但是这题卡常,要用秦九韶公式卡掉一半的乘法(和取模),还卡读入,真的垃圾题。 注意读入的时候要%p而不是-p,找到一个写法的bug不错。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXP = 1; const int p = 19260817; int ap[105]; inline int read() { int b = 0; char c = getchar(); while(true) { if(c == '-' || (c >= '0') && (c <= '9')) break; c = getchar(); } if(c == '-') { b = 1; c = getchar(); } int cur = 0; while(c >= '0' && c <= '9') { cur = (cur << 3) + (cur << 1) + (c - '0'); if(cur >= p) cur

P2312 解方程

时间秒杀一切 提交于 2019-11-30 23:00:49
a[i]的范围肥肠大!这提醒我们要不取模要不高精(别想了我是不可能写高精的) but!事情迎来了转机![1,m]的范围比较小,也就是说,我们可以暴力枚举可行的解,用秦九韶公式判断一遍就行了 能取模的依据:若f[x]==0 ,则f[x]%p==0,按理说应该多模几个质数,可是只模一个就能A掉……懒人先跑了 /* reference: translation: solution: trigger: note: * record: date: 2019.10.09 */ #include<bits/stdc++.h> using namespace std; #define int long long #define rep(i,a,b) for(int i=a;i<=b;++i) #define dwn(i,a,b) for(int i=a;i>=b;--i) #define mem(a,b) memset(a,b,sizeof(a)) const int N=1e2+10,mod=1e9+7; template <typename T>inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+

【数论】P2312解方程

∥☆過路亽.° 提交于 2019-11-30 19:06:17
【数论】P2312解方程 题目描述 已知多项式方程: \(a_0 + a_1x + a_2x^2+...+a_nx^n = 0\) 求这个方程在[1,m]内的整数解 \(1\leq n\leq100,|a_i|\leq 10^{10000},a_n≠0,m\leq 10^6\) Solution 首先由于数据过大,只能字符串读入了hhh。然后:对于每个x,算出f(x)%pi,如果f(x)=0则f(x)%pi必然=0,多选几个素数,就可以在一定范围大小内判断成功。好像不够快? \(f(x+p)≡f(x)(mod p)\) 对于一个x, \(f(x)≠0(mod p)\) ,则x+p,x+2p……均不为方程的解 有了这个性质就可以瞎搞了。取几个较大的质数搞一搞…… Code #include <iostream> #include <cstdio> using namespace std; inline long long read() { long long x = 0; int f = 0; char c = getchar(); while (c < '0' || c > '9') f |= c == '-', c = getchar(); while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c =

P2312 解方程

巧了我就是萌 提交于 2019-11-29 16:13:16
题面: https://www.luogu.org/problem/P2312 本题只要了解秦九昭算法就可解,即: 把一个n次多项式 f(x)=A[n]*x^n+A[n-1]*x^(n-1)+...+A[1]*X+A[0] 改写成如下形式: f(x)=(...((A[n]*x+A[n-1])*x+A[n-2])*x+...+A[1])*x+A[0] 求多项式的值时,首先计算最内层括号内一次多项式的值 然后由内向外逐层计算一次多项式的值 这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。 Code: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<ctime> using namespace std; const int N=1000005,M=105,p=1000000007; bool delta=true; int n,m,ans,len,sum=0; int a[M],solutions[N]; long long read(){ long long sum=0,minus=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-'){

二分法解方程

醉酒当歌 提交于 2019-11-27 00:11:21
#include <cmath> #include <iostream> using namespace std; float f(float x) { return x * x * x - 5 * x *x + 16 * x - 80; } void main(void) { float x1, x2, x0, f0, f1, f2; do { cout<<"Input x1, x2\n"; cin>>x1>>x2; f1 = f(x1); f2 = f(x2); } while (f1 * f2 > 0); do { x0 = ( x1 + x2) / 2; f0 = f(x0); if ((f0*f1)>0) { x1 = x0; f1 = f0; }else { x2 = x0; f2 = f0; } } while (fabs(f0)>=0.0001); cout<<"x = "<< x0 <<endl; } 转载于:https://www.cnblogs.com/GavinDai/archive/2011/11/13/2247621.html 来源: https://blog.csdn.net/weixin_30736301/article/details/99218607