BSGS(a^x%p=b)

来源:互联网 发布:纳网科技域名续缴费 编辑:程序博客网 时间:2024/04/30 08:11

问题

axb (mod p)
已知a,b,p求x

解法

令x=i*m-j (m=c)
j(0~m) aj*b ->map
i(1~m) 若map中存在一个元素与a^mi%p相等则返回x

code

#include<cstdio>#include<map>#include<vector>#include<cmath>#include<climits>#include<cstring>typedef long long ll;using namespace std;#define f(x,y,z) for(int x=y;x<=z;x++)ll p,m,a,b;map<ll,ll> ma;bool ok;ll ksm(ll x,int y){    if(y==0)return 1;    ll t=ksm(x,y/2);    if(y%2==0)return t*t%p;    return t*t%p*x%p;}int main(){    scanf("%lld",&p);    m=sqrt(p);    if(m*m<p)m++;    while(~scanf("%lld%lld",&a,&b))    {        ma.clear();        f(j,0,m)ma[(ksm(a,j)*b)%p]=j;        ok=0;        f(i,1,m)if(ma.find(ksm(a,m*i))!=ma.end())        {            ok=1;            printf("%lld\n",i*m-ma[ksm(a,m*i)]);            break;        }        if(!ok)printf("0\n");    }    return 0;}
0 0