调了一下午,结果发现给两个不互质的数求了逆元
开始的时候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;
}