题目链接:http://poj.org/problem?id=2417
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<cstring>
using namespace std;
typedef long long ll;
map<ll,ll>hashmp;
ll qpow(ll x,ll y,ll mo)
{
ll ans=1;
while(y){
if(y&1){
ans=ans*x%mo;
}
x=x*x%mo;
y>>=1;
}
return ans;
}
int main()
{
ll p,b,n;
while(cin>>p>>b>>n){
hashmp.clear();
if(b%p==0){
cout<<"no solution"<<endl;
continue;
}
ll m=ceil(sqrt(p));
ll t=n%p;
hashmp[t]=0;
for(ll j=1;j<=m;j++){
t=t*b%p;
hashmp[t]=j;
}
ll tmp=qpow(b,m,p);
ll tt=1;
ll j=0;
for(ll i=1;i<=m;i++){
tt=tt*tmp%p;
j=hashmp[tt];
if(j){
cout<<(i*m%p-j+p)%p<<endl;
break;
}
}
if(j==0)
cout<<"no solution"<<endl;
}
return 0;
}
参考:https://blog.youkuaiyun.com/clove_unique/article/details/50740412
https://blog.youkuaiyun.com/clover_hxy/article/details/50683832
https://blog.youkuaiyun.com/ydd97/article/details/48032257