洛谷P2312 解方程(math,枚举)

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]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值