P2312 解方程
题目描述
已知多项式方程:
a0+a1x+a2x^2 +…+anx^n=0
求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)
输入文件名为equation .in。
输入共n + 2 行。
第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。
接下来的n+1 行每行包含一个整数,依次为a0,a1,a2…an
输出文件名为equation .out 。
第一行输出方程在[1, m ] 内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m ] 内的一个整数解。
输入样例#1:
2 10
1
-2
1
输出样例#1:
1
1
输入样例#2:
2 10
2
-3
1
输出样例#2:
2
1
2
输入样例#3:
2 10
1
3
2
输出样例#3:
0
说明
30%:0<n<=2,|ai|<=100,an!=0,m<100
50%:0<n<=100,|ai|<=10^100,an!=0,m<100
70%:0<n<=100,|ai|<=10^10000,an!=0,m<10000
100%:0<n<=100,|ai|<=10^10000,an!=0,m<1000000
分析:直接计算显然是不可能的,因此我们需要在模p意义下计算,结果是一样的,p是个大质数。
代码
#include <cstdio>
#include <cstring>
#include <string>
#define N 1005
#define mo 998244353
#define ll long long
using namespace std;
ll a[N];
int tot,b[N*N],n,m;
ll read()
{
ll x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9'){if (ch == '-') f = -1; ch = getchar();}
while (ch >='0' && ch <= '9') x = (x * 10 + ch - '0') % mo, ch = getchar();
return x * f;
}
bool check(int x)
{
ll sum = 0;
for (int i = n; i >= 1; i--)
sum = (sum + a[i]) % mo * x % mo;
sum = (sum + a[0]) % mo;
if (sum == 0) return true;
return false;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i <= n; i++)
a[i] = read();
for (int i = 1; i <= m; i++)
if (check(i)) b[++tot] = i;
printf("%d\n", tot);
for (int i = 1; i <= tot; i++) printf("%d\n", b[i]);
}