洛谷 P2312 解方程题解--zhengjun

一看就不能用求根公式

首先,因为 \(a_i\) 很大,如果要高精度的话,时间复杂度都过不去。

那么,我们考虑把这个大数取模,这样如果弄出来是零,这个值就有可能是一个根。

这个模数最好是一个大质数,这样正确率会高一点

代码

#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
int n,m;
char c;
ll a[101],ans[1000001];
ll get(int x){
	register ll p=1,sum=0;
	register int i;
	for(i=0;i<=n;i++){
		sum=(sum+p*a[i]%mod)%mod;
		p=p*x%mod;
	}
	return sum;
}
int main(){
	scanf("%d%d",&n,&m);
	register int i;register bool flag;
	for(i=0;i<=n;i++){
		flag=0;
		while(c<'0'||c>'9'){if(c=='-')flag=1;c=getchar();}
		while(c>='0'&&c<='9')a[i]=((a[i]*10)%mod+(c^48))%mod,c=getchar();
		if(flag)a[i]=mod-a[i];
	}
	for(i=1;i<=m;i++){
		if(get(i)==0)ans[++ans[0]]=i;
	}
	printf("%d\n",ans[0]);
	for(i=1;i<=ans[0];i++)printf("%d\n",ans[i]);
	return 0;
}
posted @ 2022-06-11 15:06  A_zjzj  阅读(43)  评论(0编辑  收藏  举报