这个题好乱啊、、n*m就会炸,每个数还都可能是10^10000、、这n*ai tm读进去都要10^6效率 、
一般这种似乎没有任何数论定理的东西范围还这么变态只能考虑随机化算法了。、
似乎可以用取模去试,但n*m还是没法优化、 除了50%的暴力点能跑一跑之外就只能弃疗了、
好吧,这个题需要两种取模,首先读入就要模,,这个模也就意味着你将要在模这个数的意义下找解、、那么找解就1到m枚举就好了。。。
同时可以优化(必须优化)即只需从1到模数 枚举就好了 ,因为p+1 和1 是一样的、、、
统计出在模这几个数之后的可行解之后,怎么在1到m找解?
然后还是枚举,从1到m 就只需看在模这几个数意义下 把枚举的数带入x 看是否成立即可,,所以在上面对模数找解的时候记录一下函数值即可。
其实就是试运气、、 一般这种范围爆炸的数据就考虑随机化好了、
注意:取模的循环性有可能成为优化的点,取模本身可以在一定程度上保留原数的相乘、相加特征、
另外 对一个数取多次模,每个模的合特征就更加接近原数、
码:
#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>
int mod[6]={9973,9931,9941,9949,9967};
int len,n,i,j,m,zhe[20001][6],ans,shu,res[6][99999],t,cnt,daan[20001],lin[99999];
bool lal;
char ch[20009];
int main()
{
scanf("%d%d",&n,&m);
n++;
for(i=1;i<=n;i++)
{
scanf("%s",ch);
len=strlen(ch);
for(t=0;t<5;t++)
{
if(ch[0]=='-')shu=0,lal=1;
else shu=ch[0]-'0',lal=0;
for(j=1;j<len;j++)
{
shu=(shu*10+(ch[j]-'0'))%mod[t];
}
zhe[i][t]=shu;
if(lal)zhe[i][t]=-shu;
}
}
for(t=0;t<5;t++)
{
for(i=1;i<mod[t];i++)
{
lin[0]=1;
for(j=1;j<=n;j++)lin[j]=(lin[j-1]*i)%mod[t];
ans=0;
for(j=1;j<=n;j++)
{
ans=(ans+zhe[j][t]*lin[j-1]%mod[t])%mod[t];
}
res[t][i]=ans;
}
}
for(i=1;i<=m;i++)
{
lal=1;
for(t=0;t<5;t++)
{
if(res[t][i%mod[t]]!=0)
{
lal=0;
break;
}
}
if(lal)daan[++cnt]=i;
}
printf("%d\n",cnt);
for(i=1;i<=cnt;i++)printf("%d\n",daan[i]);
}