BSGS这玩意儿好像用的不是很多?好像除了POJ和HDU有两道题,然后就是SDOI的两个题了。。然后关于这玩意儿正确性的很多证明ATP都不是很懂。。这里只是解释一下它的实现过程。。
BSGS
BSGS算法(Baby Step Gaint Step)是用于求解离散对数(即 AL≡B(mod C) 中的最小的 L )的一种算法。它的实质是一种优化的枚举算法,但是它通过数学分析缩小了枚举的范围,一般在
普通的BSGS算法要求 A,C 互质。这里先贴板子再解释。。。(其中powww(a,t,Mod)是计算快速幂 at % Mod 的过程)
void BSGS(LL A,LL B,LL C){
LL m=ceil(sqrt(C)),k=B%C,am,x;
bool end=false;
if (B%C==0){
printf("No Solution\n");
return;
}
hash.clear();
hash[k]=0;
am=powww(A,m,C);
for (int j=1;j<=m;j++){
k=k*A%C;hash[k]=j;
}
x=1;
for (int i=1;i<=m;i++){
x=x*am%C;
if (hash[x]!=0){
printf("%I64d\n",((i*m-hash[x]+cnt)%C+C)%C);
end=true;
return;
}
}
if (end==false)
printf("No Solution\n");
}
对于要求的式子 AL≡B(mod C) ,首先我们设定一个值 M ,并且设