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\n",tot);
for(int i=1;i<=tot;++i)
printf("%lld\n",ans[i]);
return 0;
}
路漫漫其修远兮,吾将上下而求索