调了一下午,结果发现给两个不互质的数求了逆元
开始的时候BSGS是这样写的(为了省掉快速幂,鬼畜的写成了这样)
inline int BSGS(int a,int p,int b)
{
match.clear();
m=ceil(sqrt(p));
register int i,j,k;
for(i=0,j=b;i<=m;++i,j=1ll*a*j%p)
match[j%p]=i;
j=1ll*j%p*inv(b,p)*inv(a,p)%p;
for(i=1,k=j;i<=m;++i,k=1ll*j*k%p)
if(match[k]) return ((1ll*i*m-match[k])%p+p)%p;
return -1;
}
然后这样就对了
inline int BSGS(int a,int p,int b)
{
match.clear();
m=ceil(sqrt(p));
register int i,j,k;
for(i=0,j=1;i<=m;++i,j=1ll*a*j%p)
match[1ll*j*b%p]=i;
j=1ll*j%p*inv(a,p)%p;
for(i=1,k=j;i<=m;++i,k=1ll*j*k%p)
if(match[k]) return ((1ll*i*m-match[k])%p+p)%p;
return -1;
}