如果30pts,提醒一下,这个题求逆元要小心
查看原帖
如果30pts,提醒一下,这个题求逆元要小心
224358
清平乐楼主2020/8/10 18:44

调了一下午,结果发现给两个不互质的数求了逆元

开始的时候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;//这里b和p不一定互质,和BSGS得到板子不一样
	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;
}
2020/8/10 18:44
加载中...