2014D2T3 解方程
2014D2T3 解方程
problem
求方程(a_0+a_1x+a_2x^2+...+a_nx^n=0)在([1,m])内的整数解。
solution
秦九韶算法。大数取模。
秦九韶算法
code
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
int read(){
int a=0,op=1;char c=getchar();
while(c>'9'||c<'0') {if(c=='-') op=-1;c=getchar();}
while(c>='0'&&c<='9'){a*=10,a+=c^48,c=getchar();}
return a*op;
}
//带取模的快读
const int maxn=1e6+5;
const int mod=1e9+7;
long long n,m,ans,cnt,sum=0;
int A[105],key[maxn];
bool t=true;//用来判断是否有解
long long fastread(){
long long a=0,op=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') op=-1;c=getchar();}
while(c>='0'&&c<='9'){a=(a*10+c-'0')%mod;c=getchar();}
return a*op;
}
bool calc(long long x){
sum=0;//!
for(long long i=n;i>=1;i--) sum=((A[i]+sum)*x)%mod;//秦九韶算法,A[0]不需要乘x
sum=(sum+A[0])%mod;
return !sum;//如果答案是0说明x为多项式的解,返回1
}
int main(){
n=fastread();m=fastread();
//printf("%lld %lld",n,m);
for(long long i=0;i<=n;i++) A[i]=fastread();
for(long long i=1;i<=m;i++){
if(calc(i)){
//有解
t=false;
ans++;
key[++cnt]=i;
}
}
if(t){//ans=0
printf("%lld",ans);
return 0;
}
printf("%lld
",ans);
for(long long i=1;i<=cnt;i++){
printf("%d
",key[i]);
}
return 0;
}