30’
0<n≤2,|ai|≤100,an≠0,m<100
显然
n∈{1,2}
直接求根+判断:
n=1 :
a0+a1x=0
x=−a0a1
n=2 :
a0+a1x+a2x2=0
x=−a1±a21−4a0a2−−−−−−−−−√2a2
复杂度:
O(1)
50’
直接枚举
i∈[1,m]
高精判断是否为
0
。
复杂度:
70’
假设
f(x)=a0+a1x+a2x2+...anxn
原题就是求
f(x)=0
的解
若有
i∈[1,m]
使得
f(i)=0
那么:
f(i) mod k=0
(
k
为任意数)
=a0 mod k+a1 mod k×i mod k+...+an mod k×in mod k=0
我们在读入时取模,可以不用高精,但是考虑到:
f(i) mod k=0
那么只能说明:
k|f(i)
我们可以取
t
个
复杂度:
O(nmt)
100’
续70’算法。
我们发现
当
f(i) mod t=0
时,
f(i+pt) mod t=0
(
p∈N+
)
当
f(i) mod t≠0
时,
f(i+pt) mod t≠0
(
p∈N+
)
所以用类似筛选法筛掉就行了
#define s 10
int prime[s]={4621,8053,9227,3001,2333,5011,7121,8009,9973,1117};
int g[100010][s],p[1000010],n,m;
int f(int x,int y)
{
int r=0,t=1;
fr(i,0,n)
{
r=(r+t*g[i][y])%prime[y];
t=t*x%prime[y];
}
rt r;
}
int main(){
n=read();
m=read();
fr(i,0,n)
{
char c=gc;
while(c<'0'&&c>'9'&&c!='-')
c=gc;
int k=c=='-'?-1:1;
c=c=='-'?gc:c;
while(c>='0'&&c<='9')
{
fr(j,0,s-1)
g[i][j]=(g[i][j]*10+c-48)%prime[j];
c=gc;
}
fr(j,0,s-1)
g[i][j]*=k;
}
fr(i,0,s-1)
fr(j,0,prime[i]-1)
if(f(j,i))
for(int k=j;k<=m;k+=prime[i])
p[k]=1;
int ans=0;
fr(i,1,m)
if(!p[i])
ans++;
printf("%d\n",ans);
fr(i,1,m)
if(!p[i])
printf("%d\n",i);
rt 0;
}
复杂度: O(ntkmax)