BSGS算法专用于求 a^x=b mod p
只有当 a,p互质时才能求出解,主要思想是
我把x=i*t-j , t=sqrt(p) ,那么j的范围就是 [0,t-1] -> a^(i*t-j) = b mod p
-> a^(i*t) = b*(a^j) mod p
我们把j=[0,t-1] 都插入到 hash表内,然后
i的范围 [0,t] 算出值 看hash表内是否存在,如果存在,那么说明有解
ll bsgs(ll a,ll b,ll p){ map<ll,ll> hash; hash.clear(); b%=p; ll t=(ll)sqrt(p)+1; for(int j=0;j<t;j++){ ll val = (ll)b*power(a,j,p)%p; hash[val]=j; } a=power(a,t,p); if(a==0) return b==0?1:-1; for(int i=0;i<=t;i++){ ll val = power(a,i,p); ll j=hash.find(val)==hash.end()?-1:hash[val]; if(j>=0&&i*t-j>=0) return i*t-j; } return -1; }