1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013/8/24 0:06:54 4 File Name :F:\2013ACM练习\专题学习\数学\Baby_step_giant_step\POJ2417.cpp 5 ************************************************ */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17 #include <stdlib.h> 18 #include <time.h> 19 using namespace std; 20 //baby_step giant_step 21 // a^x = b (mod n) n为素数,a,b < n 22 // 求解上式 0<=x < n的解 23 #define MOD 76543 24 int hs[MOD],head[MOD],next[MOD],id[MOD],top; 25 void insert(int x,int y) 26 { 27 int k = x%MOD; 28 hs[top] = x, id[top] = y, next[top] = head[k], head[k] = top++; 29 } 30 int find(int x) 31 { 32 int k = x%MOD; 33 for(int i = head[k]; i != -1; i = next[i]) 34 if(hs[i] == x) 35 return id[i]; 36 return -1; 37 } 38 39 40 41 int BSGS(int a,int b,int n) 42 { 43 memset(head,-1,sizeof(head)); 44 top = 1; 45 if(b == 1)return 0; 46 int m = sqrt(n*1.0), j; 47 long long x = 1, p = 1; 48 for(int i = 0; i < m; ++i, p = p*a%n)insert(p*b%n,i); 49 for(long long i = m; ;i += m) 50 { 51 if( (j = find(x = x*p%n)) != -1 )return i-j; 52 if(i > n)break; 53 } 54 return -1; 55 } 56
原文:http://www.cnblogs.com/forgot93/p/4367128.html