同余问题
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 }