int babystep(int A,int C,int B) { int i,d,tmp,m,w,mm,ans; __int64 D; top = INF; ++ idx; d=0; D=1; ans=1; for(i=0;i<=100;i++) { if(ans==B) return i; ans=(__int64)ans*A%C; } tmp=gcd(A,C); while(tmp!=1) { if(B%tmp) return -1; ++d; C/=tmp; B/=tmp; D=D*A/tmp%C; tmp=gcd(A,C); } m=ceil(sqrt((double)C)); ans=1; for(i=0;i<=m;i++) { ins(i,ans); ans=(__int64)ans*A%C; } mm=pow_mod(A,m,C); //A^m%C for(i=0;i<=m;i++) // mm^i { tmp=Inval((int)D,C,B); if(tmp>=0 && (w=find(tmp))!=-1) return i*m+w+d; D=D*mm%C; } return -1; }
int BabyStep(int A,int B,int C){ top=maxn;++idx; ll buf=1%C,D=buf,K=0; int i,d=0,tmp; for (i=0;i<=100;buf=buf*A%C,++i) if (buf==B) return i; while ((tmp=gcd(A,C))!=1){ if (B%tmp) return -1; ++d; C/=tmp; B/=tmp; D=D*A/tmp%C; } int M=(int)ceil(sqrt(double(C))); for (buf=1%C,i=0;i<=M;buf=buf*A%C,++i) insert(i,buf); for (int i=0,K=fastpow(A,M,C);i<=M;D=D*K%C,++i){ tmp=Inval(int(D),B,C);int w; if (tmp>0&&(w=find(tmp))!=-1) return i*M+w+d; } return -1; }