Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<int>A;
- vector<int>B;
- int bin(int x){
- int beg=0,mid=0,en=B.size()-1;
- while(beg+1<en){
- mid=(beg+en)/2;
- if(B[mid]>=x) en=mid;
- else beg=mid;
- }
- return beg+1;
- }
- int szyb_pot(int a,int b,int p){
- int wyn=1,x=a%p;
- for (int i=1;i<=b;i<<=1){
- x%=p;
- if((b&i)!=0){
- wyn*=x;
- wyn%=p;
- }
- x*=x;
- }
- return wyn;
- }
- pair<int,int> ExtendedEuclid(int a,int b) {
- if (b == 0) return make_pair(a, 0);
- pair<int,int> p = ExtendedEuclid(b, a % b);
- return make_pair(p.second, p.first - (a / b) * p.second);
- }
- int main(){
- int a=0,b=0,p=0,wynik=0,temp=0,binik=0,minim=1000000,do_ilu=0;;
- pair<int,int> zmi;
- bool czy=0;
- cin>>a>>b>>p;
- A.push_back(1);
- for(int i=1;i*i<=p;i++){
- temp=szyb_pot(a,i,p);
- //zmi=ExtendedEuclid(temp,p);
- //if(zmi.first<0) zmi.first+=p;
- A.push_back(temp);
- do_ilu=i;
- }
- A.push_back(1);
- for(int i=1;i<=do_ilu;i++){
- temp=szyb_pot(A[do_ilu],i,p);
- B.push_back(temp);
- }
- for(int i=0;i<=do_ilu;i++){
- zmi=ExtendedEuclid(A[i],p);
- if(zmi.first<0) zmi.first+=p;;
- binik=bin(zmi.first*b%p);
- if(B[binik]!=zmi.first*b%p) continue;
- if(binik*do_ilu+i<minim and B[binik]==zmi.first*b%p){
- minim=i+binik*do_ilu;
- czy=1;
- }
- }
- if(czy==1) cout<<minim;
- else cout<<"NIE";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement