前些天学习了扩展欧几里得,好不容易弄懂了一些,做了两个模板题目。
void exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
LL t=x;
x=y;
y=t-(a/b)*x;
}
扩展GCD函数。大概就是列出来一个二元一次不定方程,进行扩展GCD,求得最小整数解.
有a^x=b(mod m),求最小的x
ll log_mod(ll a,ll b)
{
ll m,v,e=1,i;
m=(ll)sqrt(mod+0.5);
v=inv(power(a,m));
map<ll,ll>x;
x.clear();
x[1]=0;
for(i=1;i<m;i++)
{
e=e*a;
if(e>=mod) e%=mod;
if(x[e]==0) x[e]=i;
}
for(i=0;i<m;i++)
{
if(x.count(b))return i*m+x[b];
b=b*v;
if(b>=mod) b%=mod;
}
return -1;
}