题解:运用筛法的思想,%p意义下,F(x)!=0则F(x+p)!=0
多选几个质数把F(x)!=0的筛去就可以了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int ans;
int vis[1000009];
int p[51]={0,30011,11261,14843,19997,21893};
int a[200][51];
void Minit(){
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
ans=0;
}
char s[100009];
int main(){
scanf("%d%d",&n,&m);
// for(int i=1;i<=50;++i)p[i]=10000+i;
Minit();
for(int i=0;i<=n;++i){
scanf("%s",s);
int len=strlen(s);
for(int k=1;k<=5;++k){
if(s[0]!='-'){
a[i][k]=s[0]-'0';
}else{
a[i][k]=0;
}
for(int j=1;j<len;++j){
a[i][k]=(a[i][k]*10+(s[j]-'0'))%p[k];
}
if(s[0]=='-'){
a[i][k]=(-a[i][k]+p[k])%p[k];
}
}
}
// for(int i=0;i<=n;++i)cout<<a[i][1]<<' ';
// cout<<endl;
for(int k=1;k<=5;++k){
for(int j=1;j<=min(p[k],m);++j){
long long fx=0;
for(int i=n;i>=0;--i)fx=(fx*j+a[i][k]+p[k])%p[k];
// cout<<fx<<endl;
if(fx){
for(int d=0;j+p[k]*d<=m;++d)vis[j+p[k]*d]=1;
}
}
}
for(int i=1;i<=m;++i)if(!vis[i])++ans;
printf("%d\n",ans);
for(int i=1;i<=m;++i)if(!vis[i])printf("%d\n",i);
return 0;
}