Luogu3846 [TJOI2007] 可爱的质数/【模板】BSGS
https://www.luogu.com.cn/problem/P3846
\(BSGS\)
\(BSGS\)可以\(O( \sqrt{p} )\)处理:
\[b^l \equiv n (mod \quad p)
\]
处理方法十分常规
\[令t=\sqrt{p}+1\\
设l=kt-m\\
则b^{kt-m} \equiv n (mod \quad p)\\
b^{kt} \equiv nb^m (mod \quad p)\\
预处理出 nb^m(0 \le m<t)\\
用b^{kt} \mod p去匹配(map或Hash表)\\
\]
\(Code:\)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
ll p,b,n;
map<ll,int>a;
ll ksm(ll x,ll y)
{
ll ans=1;
while (y)
{
if (y&1)
ans=ans*x%p;
x=x*x%p;
y >>=1;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld",&p,&b,&n);
if (n==1)
{
printf("0\n");
return 0;
}
int g=(int)sqrt(p)+1;
ll c=n%p;
for (int i=0;i<g;i++)
{
a[c]=i+1;
c=c*b%p;
}
ll y=ksm(b,g);
ll e=1;
for (int i=1;i<=g;i++)
{
e=e*y%p;
if (a.find(e)!=a.end())
{
printf("%lld\n",(ll)i*g-(ll)(a[e]-1));
return 0;
}
}
puts("no solution");
return 0;
}