離散對數裸題,這道題中p是素數,所以用一般BSGS就好了,這個東西十分巧妙呀。
那麼,我們可以得到
還有一點就是,可以不用算逆元,我們可以令
//BSGS
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b,p,p1,tmp,tmp1,ans;
map <ll,ll> E;
bool flg;
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%lld%lld%lld",&p,&a,&b)!=EOF)
{
if(b==1){
printf("0\n");continue;
}
E.clear();
p1=sqrt(p);
tmp=1;
for(int i=0;i<p1;i++)E[(b*tmp)%p]=i,tmp=(tmp*a)%p;
tmp1=1;flg=false;ans=~0u>>1;
for(int j=1;j<=p1+1;j++)
{
tmp1=(tmp1*tmp)%p;
if(E.count(tmp1)){
ans=min(ans,j*p1-E[tmp1]);
flg=true;
break;
}
}
if(flg)printf("%d\n",ans);
else printf("no solution\n");
}
return 0;
}