Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 4011 | Accepted: 1849 |
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
Hint
B(P-1) == 1 (mod P)
B(-m) == B(P-1-m) (mod P) .
Source
/* *********************************************** Author :CKboss Created Time :2015年03月31日 星期二 19时39分34秒 File Name :POJ2417.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> 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<m;i++,p=p*a%n) insert(p*b%n,i); for(long long i=m;;i+=m) { if((j=find(x=x*p%n))!=-1) return i-j; if(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; }