该算法是用来解决A^x=B(mod C)这一类问题的。
BSGS算法只能适用于C为素数的情况。
m=sqrt(C);
x=m*i+j;
A^x=A^(i*m)*A^j;
每次枚举i,令D=A^(i*m);
D*A^j=B(mod C);
D*A^j+C*y=B;
用扩展欧几里得可以求出A^j
通过hash查出对应的j;
#include
#include
#include
using namespace std;
#define LL long long
const int sqr=50007;
bool hash[sqr+10];
LL val[sqr+10],j[sqr+10],A,B,C;
void insert(LL jj,LL vv)
{
int v=vv%sqr;
while(hash[v]&&val[v]!=vv)
{
v++;
if(v==sqr)
v-=sqr;
}
hash[v]=1;
j[v]=jj;
val[v]=vv;
}
int found(LL vv)
{
int v=vv%sqr;
while(hash[v]&&val[v]!=vv)
{
v++;
if(v==sqr)
v-=sqr;
}
if(hash[v]==0)
return -1;
return j[v];
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
LL ret=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
return ret;
}
LL baby_step(LL A,LL B,LL C)
{
for(int i=0;i