题目大意:已知多项式方程: 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)。
题解:傻逼hash题,我取了三个模数,然后把每个系数分别取模;如果a不是解那么显然a+mod也不是解。经过三重筛选以后,剩下的基本上(很大概率)就是解了(逃)。我不用秦九韶就被卡了qaq。
%%%__debug大神
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int MAXN=101,MAXM=1000001;
const int prime[] = {10007,10917,30071};
int n,m,a[MAXN+1][3],vis[MAXM],f[40000][3],cnt[MAXN];
vector<int> res;
char s[102][10010];
int Read(int p,int j)
{
char x=0;int flag=0,c=0,sig=1,pos=0;
while(pos<strlen(s[p]))
{
x=s[p][pos++];
if(x=='-')sig=-1;
else if(x>='0'&&x<='9')c*=10,c%=prime[j],c+=x-'0',flag=1;
else if(flag)break;
}
c%=prime[j];
return c*sig;
}
int g(int value,int j)
{
long long tmp = 0;
for (int i = n; i>=0; --i)
tmp = (tmp * value + a[i][j]) % prime[j];
return tmp != 0;
}
int main()
{
freopen("equation.in","r",stdin);
freopen("equation.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=0;i<=n;i++)scanf("%s",s[i]);
for(int j=0;j<3;j++)
for(int i=0;i<=n;i++)
a[i][j]=Read(i,j);
for(int i=0;i<3;i++)
for(int j=0;j<=prime[i];j++)
f[j][i]=g(j,i);
for(int i=0;i<3;i++)
for(int j=1;j<=m;j++)
if(f[j%prime[i]][i]!=0)
vis[j]=1;
for(int i=1;i<=m;i++)if(!vis[i])res.push_back(i);
sort(res.begin(),res.end());
int m=unique(res.begin(),res.end())-res.begin();
printf("%d\n",m);
for(int i=0;i<m;i++)
printf("%d ",res[i]);
}