题解:本题主要考查数论综合。
简要题意:
a
0
+
a
1
x
+
a
2
x
2
+
⋯
+
a
n
x
n
=
0
a_0+a_1x+a_2x^2+⋯+a_nx^n=0
a0+a1x+a2x2+⋯+anxn=0求这个方程在
[
1
,
m
]
[1,m]
[1,m]内的整数解(
n
n
n和
m
m
m均为正整数)。
1.秦九韶定理:解一元多次方程定理:
a
0
+
a
1
x
+
a
2
x
2
+
⋯
+
a
n
x
n
a_0+a_1x+a_2x^2+⋯+a_nx^n
a0+a1x+a2x2+⋯+anxn
=
a
0
+
x
∗
(
a
1
+
a
2
x
+
a
3
x
2
+
⋯
+
a
n
x
n
−
1
)
=a_0+x*(a_1+a_2x+a_3x^2+⋯+a_nx^{n-1})
=a0+x∗(a1+a2x+a3x2+⋯+anxn−1)
=
a
0
+
x
∗
(
a
1
+
x
∗
(
a
2
+
a
3
x
+
⋯
+
a
n
x
n
−
2
)
)
=a_0+x*(a_1+x*(a_2+a_3x+⋯+a_nx^{n-2}))
=a0+x∗(a1+x∗(a2+a3x+⋯+anxn−2))
=
⋯
=⋯
=⋯
=
a
0
+
x
∗
(
a
1
+
⋯
+
x
∗
(
a
n
−
2
+
x
∗
(
a
n
−
1
+
a
n
x
+
)
)
)
=a_0+x*(a_1+⋯+x*(a_{n-2}+x*(a_{n-1}+a_nx+) ) )
=a0+x∗(a1+⋯+x∗(an−2+x∗(an−1+anx+)))
这样,求
n
n
n次多项式
f
(
x
)
f(x)
f(x)的值就转化为求n个一次多项式的值。
2.一系列的优化:
100
%
100\%
100% 的数据,
0
<
n
≤
100
,
∣
a
i
∣
≤
1
0
10000
,
m
≤
1
0
6
0<n≤100,|a_i|≤10^{10000},m≤10^6
0<n≤100,∣ai∣≤1010000,m≤106,数据异常的大,已经爆
l
o
n
g
l
o
n
g
long long
longlong了,所以防爆
i
n
t
int
int常用方法:模大质数!质数一定要大,最好多模几个大质数。要写读写优化,否则超时
代码如下:
#include<cstdio>
#include<iostream>
#define mod 1000000009
long long n,m,sum;
long long a[105],Ans[1000005];
long long Read()
{
char ch;int fh=1;
scanf("%c",&ch);
while (ch<'0'||ch>'9')
{
if(ch=='-') fh=-1;
scanf("%c",&ch);
}
long long num=0;
while (ch>='0'&&ch<='9')
{
num=num*10+ch-'0';
num%=mod;
scanf("%c",&ch);
}
num*=fh;
return num;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(long long i=0;i<=n;i++)
a[i]=Read();
for(long long x=1;x<=m;x++)
{
long long ans=0;
for(long long i=n;i>=1;i--)
ans=((ans+a[i])*x)%mod;
if((ans+a[0])%mod==0)
Ans[++sum]=x;
}
printf("%lld\n",sum);
for(long long i=1;i<=sum;i++)
printf("%lld\n",Ans[i]);
return 0;
}