我优化不了了,求助qwq
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#if(__cplusplus == 201103L)
#include <unordered_map>
#include <unordered_set>
#else
#include <tr1/unordered_map>
#include <tr1/unordered_set>
namespace std
{
using std::tr1::unordered_map;
using std::tr1::unordered_set;
}
#endif
const int N=1e5+10;
const int INF=0x3f3f3f3f;
using namespace std;
long long p,b,n;
unordered_map<long long ,long long> mp;
inline void read(long long &num)
{
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')
{
w = -1;
ch = getchar();
}
}
while(ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0';
ch = getchar();
}
num = s*w;
}
inline long long qpow(register long long a,register long long n,register long long p)
{
if(n==0)
{
return 1;
}
else if(n%2==1)
{
return qpow(a,n-1,p)*a%p;
}
else
{
long long temp=qpow(a,n/2,p)%p;
return temp*temp%p;
}
// int ans=1;
// while(n)
// {
// if(n&1)
// {
// ans*=a;
// }
// a*=a;
// n>>=1;
// }
// return ans;
}
inline void bsgs(register long long a,register long long b,register long long p)//a^x≡b(mod p)
{
if(b==1)
{
cout<<0;
return ;
}
register long long m=ceil(sqrt(p));
register long long t=b;
mp[b]=0;
for(register long long j=1;j<m;j++)
{
t=t*a%p;
mp[t]=j;
}
register long long qp=qpow(a,m,p);
t=1;
for(register long long i=1;i<=n;i++)
{
t=t*qp%p;
if(mp.count(t)!=0)
{
cout<<i*m-mp[t];
return ;
}
}
cout<<"no solution";
}
signed main()
{
read(p),read(b),read(n);
bsgs(b,n,p);
return 0;
}