Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 4624 | Accepted: 2113 |
Description
BL == N (mod P)
Input
Output
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
题意:
a^x = b(mod n) ,求解x(模板题)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; typedef long double ld; using namespace std; #define 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 != -1;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 < m;i++,p = p*a%n) insert(p*b%n,i); for(ll i = m;;i+=m) { if((j = find(x = x*p % n)) != -1) return i-j; if(i > n) break; } return -1; } int main() { int p,b,n; while(scanf("%d%d%d",&p,&b,&n) != EOF) { int ans = BSGS(b,n,p); if(ans == -1) printf("no solution\n"); else printf("%d\n",ans); } return 0; }