题目大意:
A^x=B(%mod),求x
分析:
BSGS
详情请见http://www.cnblogs.com/yuiffy/p/3877381.html
代码如下:
(当然是抄的模板……>_<)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
int A,B,MOD,t,D,ans,m;
class hash{
public:
hash(){
memset(a,-1,sizeof(a));
}
int locate(int x){
int l=x%mod;
while(a[l]!=x&&a[l]!=-1)
l=(l+1)%mod;
return l;
}
void insert(int x,int val){
int l=locate(x);
if(a[l]==-1)
a[l]=x,v[l]=val;
}
int get(int x){
int l=locate(x);
return a[l]==x?v[l]:-1;
}
void clear(){
memset(a,-1,sizeof(a));
}
private:
static const int mod=100007;
int a[mod+100],v[mod+100];
}S;
int ex_gcd(int a,int b,int &x,int &y){
if(b==0)
return x=1,y=0,a;
int s=ex_gcd(b,a%b,x,y),tmp=x;
x=y,y=tmp-a/b*y;
return s;
}
void BSGS(){
S.clear(),m=ceil(sqrt((double)MOD)),t=1;
for(int i=0;i<m;i++)//Baby Step
S.insert(t,i),t=t*A%MOD;
D=1,ans=-1;
int x,y;
for(int i=0;i<m;i++){
ex_gcd(D,MOD,x,y);//x=1/A^(i*m).....D在%MOD意义下的逆元
x=((x*B)%MOD+MOD)%MOD,y=S.get(x);
if(y!=-1){
ans=i*m+y;
break;
}
D=(D*t)%MOD;//D=t^i=A^(i*m)
}
if(ans==-1)
printf("no solution\n");
else
printf("%lld\n",ans);
}
signed main(void){
while(scanf("%lld%lld%lld",&MOD,&A,&B)!=EOF){
BSGS();
}
return 0;
}
by >_< neighthorn