求解于形似:
此类问题
步骤:
- x替换为i∗m−ji*m-ji∗m−j(mmm为sqrt(P)sqrt(P)sqrt(P)向上取整)
- 移项为Ai∗m≡B∗Aj(modP)A^{i*m}≡B*A^j(mod P)Ai∗m≡B∗Aj(modP)
- 从0−m0-m0−m枚举B∗AjB*A^jB∗Aj的值并哈希存储
- 从1−m1-m1−m枚Ai∗mA^{i*m}Ai∗m如果存在B∗AjB*A^jB∗Aj与之相等就输出
int m=ceil(sqrt(p));
if(y%p==0&&z) cout<<"Orz, I cannot find x!"<<endl;
else{
v.clear();
int now=z%p,f=pow(y,m);
v[now]=0;
for(int i=1;i<=m;i++){
now=(now*y)%p;
v[now]=i;
}
now=1;
int flag=0;
for(int i=1;i<=m;i++){
now=(now*f)%p;
if(v[now]){
ans=(i*m-v[now])%p;
cout<<(ans+p)%p<<endl;
flag=1;
break;
}
}
if(!flag)cout<<"Orz, I cannot find x!"<<endl;