【正经题解】解方程
2024-02-22 15:07:12
发布于:浙江
23阅读
0回复
0点赞
设 ( ) * * ^ .. * ^
若 ( ) 则 ( ) ( 为任意非 实数)
随意试几个 ,若 ( ) 都是 ,那 很有可能就是方程的解
但有几点要注意:
。 最好是质数 。 试得越多, 越大正确率越高,但也会慢一点点,根据实际情况自己调节
如果光是这样,理论上只能过 %的数据,可能是因为评测机快吧,这样也能过
我提供一个好一点的算法
注意到当 ( ) 时 ( * ) ( 为整数)
这样可以避免枚举很多无用的解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p=10007,q=100000007;
int n,m,i,cnt,ans[1000003],v[p],y;
ll a[103],b[103],aa,bb;
char c;
inline char gc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
int x=0,fl=1;char ch=gc();
for (;ch<48||ch>57;ch=gc())if(ch=='-')fl=-1;
for (;48<=ch&&ch<=57;ch=gc())x=(x<<3)+(x<<1)+(ch^48);
return x*fl;
}
inline bool f(int p,int M,ll *t){//把p代入方程,判断模M是否为0
ll x=t[n];
for (int i=n-1;i>=0;i--) x=(x*p+t[i])%M;
return x==0;
}
inline void wri(int a){if(a<0)a=-a,putchar('-');if(a>=10)wri(a/10);putchar(a%10|48);}
inline void wln(int a){wri(a);puts("");}
int main(){
n=read();m=read();
for (i=0;i<=n;i++){//读入优化
aa=0,bb=0;
for (c=gc(),y=0;c<48 || 57<c;c=gc()) if (c=='-') y=1;
for (;48<=c && c<=57;c=gc()) aa=((aa<<3)+(aa<<1)+(c^48))%p,bb=((bb<<3)+(bb<<1)+(c^48))%q;
a[i]=y?p-aa:aa;
b[i]=y?q-bb:bb;
}
for (i=0;i<p;i++)
if (f(i,p,a)) v[i]=1;
for (i=1;i<=m;i++)
if (v[i%p] && f(i,q,b)) ans[cnt++]=i;
wln(cnt);
for (i=0;i<cnt;i++) wln(ans[i]);
}
这里空空如也
有帮助,赞一个