EXBSGS模板
Posted lnxcj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXBSGS模板相关的知识,希望对你有一定的参考价值。
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define mod 600000 6 using namespace std; 7 int cnt,tot; 8 int head[600005]; 9 long long a,b,c,x,y; 10 struct Edge{ 11 int fr; 12 int val; 13 int nxt; 14 long long to; 15 }edge[600005]; 16 void init(){ 17 cnt=0; 18 memset(head,-1,sizeof(head)); 19 } 20 void addedge(int u,long long v,int w){ 21 edge[cnt].fr=u; 22 edge[cnt].to=v; 23 edge[cnt].val=w; 24 edge[cnt].nxt=head[u]; 25 head[u]=cnt++; 26 } 27 long long exgcd(long long i,long long j,long long &x,long long &y){ 28 if(!j){ 29 x=1,y=0; 30 return i; 31 } 32 long long tmp=exgcd(j,i%j,y,x); 33 y-=(i/j)*x; 34 return tmp; 35 } 36 long long BSGS(long long A,long long B,long long C){ 37 init(); 38 int m=sqrt(C); 39 long long mul1=1; 40 long long mul2=1; 41 for(int i=1;i<=m;i++){ 42 mul1=(mul1*A)%C; 43 long long ad=(mul1*B)%C; 44 if(!ad)return -1; 45 addedge(ad%mod,ad,i); 46 } 47 for(int i=1;i<=m+3;i++){ 48 mul2=(mul2*mul1)%C; 49 for(int j=head[mul2%mod];j!=-1;j=edge[j].nxt){ 50 long long v=edge[j].to; 51 if(v==mul2)return 1ll*i*m-1ll*edge[j].val; 52 } 53 } 54 return -1; 55 } 56 void EXBSGS(long long A,long long B,long long C){ 57 tot=0; 58 long long d=exgcd(A,C,x,y); 59 long long mul=1; 60 while(d!=1){ 61 if(B%d){ 62 if(B==1){ 63 printf("0 "); 64 return; 65 }else{ 66 printf("No Solution "); 67 return; 68 } 69 } 70 B/=d,C/=d,tot++,mul*=(A/d); 71 d=exgcd(A,C,x,y); 72 } 73 d=exgcd(mul,C,x,y); 74 x=(x%C+C)%C; 75 long long ans=BSGS(A,(B*x)%C,C); 76 if(ans!=-1)printf("%lld ",ans+tot); 77 else printf("No Solution "); 78 } 79 int main(){ 80 while(1){ 81 scanf("%lld%lld%lld",&a,&b,&c); 82 if(!a&&!b&&!c)break; 83 EXBSGS(a,c,b); 84 } 85 return 0; 86 }
以上是关于EXBSGS模板的主要内容,如果未能解决你的问题,请参考以下文章