[TJOI2007] 可爱的质数

题意

求最小的\(x\)满足\(a^x \equiv b\mod p\)

想法

这个是标准的板子题,\(BSGS\)算法可以用来解决\(a^x \equiv b\mod p\)\(x^a \equiv b\mod p\)问题
本题是前者

我们考虑这样 \(a^{A * \sqrt p - B} \equiv b\mod p\)

\(a^{A * \sqrt p} \equiv ba^{B}\mod p\)
其中(\(A,B < \sqrt p\)
我们先枚举\(B\)统计出\(ba^B\)的答案用\(hash 或者 map\)给存下来
再枚举\(A\)统计答案即可

代码(与想法里的字符不同)

#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
#define ll long long

using std::map;

ll a,b,p;
ll A,B,minn = 0x3f3f3f3f;

map<ll,ll>QWQ;

ll ans[1000],cnt;

int main(){
	scanf("%lld%lld%lld",&p,&a,&b);//5 2 3 2 ^ x == 3 (mod 5)
	ll s = ceil(sqrt(p));
	if(a % p == 0){
		puts("no solution");
		return 0;
	}
	QWQ[s] = 0;
	B = b,A = 1;
	for(int i = 1;i <= s;++i){
		B = (B * a) % p;
		A = (A * a) % p;
		QWQ[B] = i;
	} 
	ll now = 1;
	for(int i = 1;i <= s;++i){
		now = (now * A) % p;
		if(QWQ[now]){
			std::cout<<(i * s - QWQ[now] + 2 * p) % p<<std::endl;
			return 0;
		}
	}
	puts("no solution");
}
posted @ 2021-01-07 13:26  fhq_treap  阅读(75)  评论(0编辑  收藏  举报