裸的ex_bsgs,不懂ex_bsgs的可以看看这篇博客---->超级跳转
#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<ll,ll> mp;
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
ll powmod(ll x,ll y,ll mod)
{
ll sum=1;
while(y)
{
if(y&1)
{
sum=sum*x%mod;
}
x=x*x%mod;
y>>=1;
}
return sum;
}
void ex_bsgs(ll a,ll b,ll mod)
{
ll i,j;
if(b==1)
{
printf("0
");
return;
}
ll k=0,x=1;
while(true)
{
ll d=gcd(a,mod);
if(d==1) break;
if(b%d)
{
printf("No Solution
");
return;
}
mod/=d,b/=d,++k,x=x*a/d%mod;
if(x==b)
{
printf("%lld
",k);
return;
}
}
mp.clear();
ll m=sqrt(mod)+1,t,tt;
for(i=0,t=b;i<m;i++,t=t*a%mod) mp[t]=i;
for(i=1,tt=powmod(a,m,mod),t=x*tt%mod;i<=m;i++,t=t*tt%mod)
{
j=mp.find(t)==mp.end()?-1:mp[t];
if(j>=0&&i*m-j+k>=0)
{
printf("%lld
",i*m-j+k);
return;
}
}
}
int main()
{
ll i,j,x,z,k;
while(true)
{
scanf("%lld%lld%lld",&x,&z,&k);
if(k==0&&z==0&&x==0) break;
ex_bsgs(x,k,z);
}
return 0;
}