前置知识
题意
多组询问,每次询问依次给定 \(p,a,b\),求 \(a^{x} \equiv b \pmod{p}\) 的最小非负整数解,其中 \(a,p\) 互质。
解法
BSGS 板子题,不做过多介绍。
貌似本题比 P3846 [TJOI2007] 可爱的质数/【模板】BSGS 和 BZOJ3239 Discrete Logging 数据较强,记得特判 \(b \bmod p=1\) 时的情况。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
ll qpow(ll a,ll b,ll p)
{
ll ans=1;
while(b>0)
{
if(b&1)
{
ans=ans*a%p;
}
b>>=1;
a=a*a%p;
}
return ans;
}
ll bsgs(ll a,ll b,ll p)
{
if(1%p==b%p)
{
return 0;
}
else
{
map<ll,ll>vis;
ll k=sqrt(p)+1,i,sum;
for(i=0;i<=k-1;i++)
{
vis[b*qpow(a,i,p)%p]=i;
}
a=qpow(a,k,p);
for(i=0;i<=k;i++)
{
sum=qpow(a,i,p);
if(vis.find(sum)!=vis.end())
{
if(i*k-vis[sum]>=0)
{
return i*k-vis[sum];
}
}
}
return -1;
}
}
int main()
{
ll a,b,p,ans;
while(cin>>p>>a>>b)
{
ans=bsgs(a,b,p);
if(ans==-1)
{
cout<<"no solution"<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}
后记
推荐一个辅助调试 Uva 题目的网站 udebug。
虽然可能已经人尽皆知了。