//ax+by=d
void gcd(LL a,LL b,LL& d,LL& x,LL& y){
if(!b){d=a;x=1;y=0;}
else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
// a^p mod n
LL pow_mod(LL a,LL p,LL n)
{
if(p==0) return 1;
LL ans=pow_mod(a,p/2,n);
ans=ans*ans%n;
if(p%2==1) ans=ans*a%n;
return ans;
}
// a mod n 的逆
LL inv(LL a,LL n)
{
LL d,x,y;
gcd(a,n,d,x,y);
return d==1?(x+n)%n:-1;
}
// 解模方程a^x=b(mod n) n为素数
int log_mod(int a,int b,int n)
{
int m,v,e=1,i;
// printf("ddddd\n");
m=(int)sqrt(n+0.5);
v=inv(pow_mod(a,m,n),n);
// printf("log_mod ok\n");
map<int,int>x;
x[1]=0;
for(i=1;i<m;i++)
{
e=mul_mod(e,a,n);
if(!x.count(e))x[e]=i;
}
for(i=0;i<m;i++)
{
if(x.count(b))return i*m+x[b];
b=mul_mod(b,v,n);
}
return -1;
}