链接:https://www.luogu.org/problemnew/show/P2312
一开始看了很久毫无思路,用秦九韶算法n*m因为高精度而gg,最后看题解发现是取模之后计算(一种类似哈希的搞法?)一个模数可能不稳,可能要想多模hash一样多搞几个,但因为出题人把n*m设为1e8也不知道是什么鬼怕tle就只写一个模数了。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int a[110],n,m;
void read(int &x)
{
char c=getchar();int r=1;
while(!isdigit(c))
{
if(c=='-')r=-1;
c=getchar();
}
while(isdigit(c))x=(1LL*x*10+c-48)%mod,c=getchar();
x*=r;x=(x+mod)%mod;
}
void write(int x)
{if(x>=10)write(x/10);putchar('0'+x%10);}
int main()
{
int nw;vector<int>res;
read(n),read(m);
for(int i=0;i<=n;i++)
read(a[i]);
for(int i=1;i<=m;i++)
{
nw=0;
for(int j=n;j>=0;j--)
{
nw=(1LL*nw*i+a[j])%mod;
}
if(!nw)res.push_back(i);
}
write(res.size()),puts("");
for(int i=0;i<res.size();i++)
write(res[i]),puts("");
}