解方程 洛谷p2312

来源:互联网 发布:根域名中国镜像服务器 编辑:程序博客网 时间:2024/05/21 19:04

题目描述

已知多项式方程:

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

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

输入输出格式

输入格式:

输入文件名为equation .in。

输入共n + 2 行。

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

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

输出格式:

输出文件名为equation .out 。

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

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

输入输出样例

输入样例#1:
2 10 1-21
输出样例#1:
11
输入样例#2:
2 102-31
输出样例#2:
212
输入样例#3:
2 10 1  3  2   
输出样例#3:
0

说明

对于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


用秦九韶算法依次检验1到m中的每一个数,为了避免高精运算,可以每步模一个大质数。

优化:选择小质数p,由于最后是mod p的,因此只需检验1-p即可,因为若m不成立,则m+p也一定不成立,由于这种方法比较麻烦,所以没有写。

#include<iostream>#include<cctype>#include<cstdio>#define f(i,l,r) for(i=(l);i<=(r);i++)#define ff(i,r,l) for(i=(r);i>=(l);i--)using namespace std;const int MAXN=105,MOD=1000000007;long long n,m,a[MAXN];int pd[1000005];inline int read(){char c=getchar();long long x=1,w=0;while(!isdigit(c)&&c!='-') c=getchar();if(c=='-'){x=-1;c=getchar();} while(isdigit(c)){w=(w*10+c-'0')%MOD;c=getchar();}return w*x;}inline bool check(int x){int i;long long sum=0;ff(i,n+1,1){sum=(sum*x+a[i])%MOD;}return !sum;}int main(){//ios::sync_with_stdio(false);int i,j,ans=0;cin>>n>>m;f(i,1,n+1){a[i]=read();}f(i,1,m){if(check(i)){ans++;pd[ans]=i;}}cout<<ans<<endl;f(i,1,ans){cout<<pd[i]<<endl;}return 0;}


原创粉丝点击