POJ 2417 Discrete Logging BSGS

2015-07-20 17:07:32 · 作者: · 浏览: 5

?

?

Discrete Logging
Time Limit: 5000MS ? Memory Limit: 65536K
Total Submissions: 4011 ? Accepted: 1849

?

Description

Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, base B, modulo P. That is, find an integer L such that
    BL == N (mod P)

Input

Read several lines of input, each containing P,B,N separated by a space.

Output

For each line print the logarithm on a separate line. If there are several, print the smallest; if there is none, print "no solution".

Sample Input

5 2 1
5 2 2
5 2 3
5 2 4
5 3 1
5 3 2
5 3 3
5 3 4
5 4 1
5 4 2
5 4 3
5 4 4
12345701 2 1111111
1111111121 65537 1111111111

Sample Output

0
1
3
2
0
3
1
2
0
no solution
no solution
1
9584351
462803587

Hint

The solution to this problem requires a well known result in number theory that is probably expected of you for Putnam but not ACM competitions. It is Fermat's theorem that states
   B(P-1) == 1 (mod P)

for any prime P and some other (fairly rare) numbers known as base-B pseudoprimes. A rarer subset of the base-B pseudoprimes, known as Carmichael numbers, are pseudoprimes for every base between 2 and P-1. A corollary to Fermat's theorem is that for any m
   B(-m) == B(P-1-m) (mod P) .

Source

Waterloo Local 2002.01.26

?

?

?

/* ***********************************************
Author        :CKboss
Created Time  :2015年03月31日 星期二 19时39分34秒
File Name     :POJ2417.cpp
************************************************ */

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include
             using namespace std; const int MOD=76543; int hs[MOD],head[MOD],next[MOD],id[MOD],top; void insert(int x,int y) { int k=x%MOD; hs[top]=x; id[top]=y; next[top]=head[k]; head[k]=top++; } int find(int x) { int k=x%MOD; for(int i=head[k];~i;i=next[i]) if(hs[i]==x) return id[i]; return -1; } int BSGS(int a,int b,int n) { memset(head,-1,sizeof(head)); top=1; if(b==1) return 0; int m=sqrt(n*1.0),j; long long x=1,p=1; for(int i=0;i
             
              n) break; } return -1; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int b,n,p; while(scanf("%d%d%d",&p,&b,&n)!=EOF) { int ans=BSGS(b,n,p); if(ans==-1) puts("no solution"); else printf("%d\n",ans); } return 0; } 
             
           
          
         
        
       
      
     
    
   
  


?

?

?