BSGS算法
题目
给定a,b,p,其中p为质数
求使 ax≡b(mod p) 成立的最小自然数 x
分析
由于p为质数,所以ap≡a(mod p)(欧拉定理)
要使x最小,x∈[0,p−1]
设t=⌈√p⌉,i∈[1,t],j∈[1,t]
则 i∗t−j∈[0,p−1]
即ai∗t−j≡b(mod p)
移项得ai∗t≡b∗aj(mod p)
先枚举j∈[1,t], 计算所有b∗aj mod p,并放入哈希表中
后枚举i∈[1,t], 计算所有ai∗t mod p,并在哈希表中查询
在存入时如果有冲突,由于要使i∗t−j尽量小,用较大的j覆盖较小的j
时间复杂度O(√p)
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll bsgs(ll a, ll b, ll p)
{
map<ll, ll> hash;
ll t = sqrt(p) + 1, cur = 1, now = 1;
for (ll j = 1; j <= t; j ++ )
{
cur = cur * a % p;
hash[b * cur % p] = j;
}
for (ll i = 1; i <= t; i ++ )
{
now = now * cur % p;
if (hash.count(now))return i * t - hash[now];
}
return -1;
}
int main()
{
ll p, a, b;
scanf("%lld%lld%lld", &p, &a, &b);
ll ans = bsgs(a, b, p);
if (ans == -1)puts("no solution");
else printf("%lld", ans);
return 0;
}