同余问题

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 Update2021.8.1:更新了BSGS板子的代码,更加简洁易懂的版本

 

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll p,a,b;
 5 map<ll,ll> mp;
 6 
 7 inline void BSGS(ll a,ll b,ll p) {
 8     ll m=ceil(sqrt(p));
 9     ll tmp=1,d=1,j;
10     mp[b%p]=m+1;
11     for(ll i=1;i<m;++i) (tmp*=a)%=p,mp[(b*tmp)%p]=i;
12     (tmp*=a)%=p;
13     for(ll i=1;i<m;++i) {
14         (d*=tmp)%=p,j=mp[d];
15         if(j) {
16             if(j==m+1) j=0;
17             printf("%lld\n",i*m-j);
18             return ;
19         }
20     }
21     printf("no solution\n");
22 }
23 
24 int main()
25 {
26     scanf("%lld%lld%lld",&p,&a,&b);
27     BSGS(a,b,p);
28     return 0;
29 }

 

 

 

 

 

 

 

posted @ 2021-07-30 23:53  上官书房  阅读(64)  评论(0)    收藏  举报