题目描述
给定一个质数P(2<=P<2312^{31}231),以及一个整数B(2<=B<P),一个整数N(2<=N<P)。
现在要求你计算一个最小的L,满足BL≡N(modP)。
题目分析
BSGS裸题。
偷一张网上看到的好图来说明一下BSGS算法(转侵删)
Code
#include<iostream> #include<cstdio> #include<cmath> #include<map> using namespace std; long long p,b,n; long long ans = 1; map<long long,int> Hash; long long quick_pow(long long x,long long y) { long long res = 1; while(y) { if(y & 1) res = res * x % p; x = x * x % p; y >>= 1; } return res; } int main() { scanf("%lld%lld%lld",&p,&b,&n); if(!b%p) { puts("no solution"); return 0; } long long m = ceil(sqrt(p)); Hash[n%p] = 0; for(long long i = 1;i <= m;i++) { Hash[quick_pow(b,i) * n % p] = i; } long long tmp = quick_pow(b,m); for(int i = 1;i <= m;i++) { ans = ans * tmp % p; if(Hash[ans]) { printf("%lld",((i*m - Hash[ans]) % p + p)%p); return 0; } } puts("no solution"); return 0; }