[模板]BSGS

 1 void insert(int J,int V){
 2     int v=V%sqr;
 3     while(hash[v]&&va[v]!=V)v++,v=(v==sqr?0:v);
 4     if(!hash[v])hash[v]=1,j[v]=J,va[v]=V;
 5 }
 6 int find(int V){
 7     int v=V%sqr;
 8     while(hash[v]&&va[v]!=V)v++,v=(v==sqr?0:v);
 9     if(!hash[v])return -1;return j[v];
10 }
11 void ex_gcd(int a,int b,int &x,int &y){
12     if(!b){x=1;y=0;return;}
13     ex_gcd(b,a%b,x,y);
14     int res=x;x=y;y=res-a/b*y;
15 }
16 int BSGS(int a,int b,int c){
17     int m=ceil(sqrt(c*1.0)),d=1,res=1,x,y;
18     for(int i=0;i<=sqr+9;++i)hash[i]=0;
19     for(int j=0;j<m;++j)insert(j,d),d=d*a%c;
20     for(int i=0;i<m;++i){
21         ex_gcd(res,c,x,y);x*=b;x=(x%c+c)%c;
22         y=find(x);if(y!=-1)return i*m+y;
23         res=res*d%c;
24     }
25     return -1;
26 }
View Code

 

posted @ 2019-07-07 07:21  DeepinC  阅读(68)  评论(0编辑  收藏  举报