P2312 解方程

P2312 解方程

随机化的通俗解释:当无法得出100%正确的答案时,考虑随机化一波,于是这份代码很大可能会对(几乎不可能出错)。

比如这题:把系数都模一个大质数(也可以随机一个质数),然后O(m)跑一遍检验就好了。

这里插一句,说一下如何随机一个大质数:先搞一个数据范围差不多的数x(rand出来),然后不断 (o(sqrt{n})) 判断x是否为质数,不是就+1.因为质数比较密集,所以复杂度不会很大。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1000000007;
const int N=105;
int a[N],m,ans[N],tot,n;
int rd()
{
	char c=getchar();
	int f=1,x=0;
	while(c>'9'||c<'0')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=((x<<3)+(x<<1)+c-'0')%mod;
		c=getchar();
	}
	return x*f;
}
int f(int x)
{
	int res=0;
	for(int i=n;i>=1;--i)
		res=(res+a[i])*x%mod;
	return (res+a[0])%mod;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=0;i<=n;++i)a[i]=rd();
	for(int i=1;i<=m;++i)
		if(!f(i))ans[++tot]=i;
	printf("%lld
",tot);
	for(int i=1;i<=tot;++i)
		printf("%lld
",ans[i]);
	return 0;
}
路漫漫其修远兮,吾将上下而求索
原文地址:https://www.cnblogs.com/zzctommy/p/12359247.html