题目大意:对于,给定a,b,p,求x,其中p为质数。
裸Baby-step-Giant-step
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long LL;
LL f_pow(LL x,LL y,LL MOD) {
LL tmp=1;
while(y) {
if(y&1) (tmp*=x)%=MOD;
(x*=x)%=MOD;
y>>=1;
}
return tmp;
}
map<LL,LL> h;
LL BSGS(LL a,LL b,LL p){
h.clear();
LL m=LL(sqrt(p)+1);
for(int i=0;i<m;i++) {
if(!h.count(b)) h[b]=i;
b=b*a%p;
}
LL now=1,base=f_pow(a,m,p);
for(int i=1;i<=m+1;i++) {
now=now*base%p;
if(h.count(now)) return i*m-h[now];
}
return -1;
}
int main() {
LL B,P,N;
while(scanf("%lld%lld%lld",&P,&B,&N)==3) {
LL ans=BSGS(B,N,P);
if(ans==-1) printf("no solution\n");
else printf("%lld\n",ans);
}
return 0;
}