题目描述
已知多项式方程:
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 ] 内的一个整数解。
输入输出样例
说明
对于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;
}