问题
已知 ,且a与P互质,求解同余方程
算法推导
设
设
,即
,
所以满足
,
得
算法流程
先枚举j,将得到的
存入hash表;
再枚举i,计算
,是否存在hash表中,如果有,则找到了解,输出即可。
为保证答案最小,必须保证先枚举j,再枚举i,且保证 在hash表中j从小到大排列
代码
long long work(long long a,long long b,long long P)
{
long long m,v,e=1,i;
m=ceil(sqrt(P+0.5));
v=pow_mod(a,m,P);
v=inv(v);//v=a^(-im)
Hash::clear();
Hash::add(1,0);
for(i=1;i<m;i++)
{
e=(e*a)%P;
if(Hash::get(e)==-1)
Hash::add(e,i);
}
for(i=0;i<m;i++)
{
int t=Hash::get(b);
if(t!=-1)
return i*m+t;
b=(b*v)%P;
}
return -1;
}
模板题
POJ2417