[CQOI2018]破解D-H协议

[CQOI2018]破解D-H协议

luogu
BZOJ
题面看了好久啊...
题意:给定(A=g^amod p,B=g^bmod p),求(g^{ab}mod p)(p为质数且g是p的一个原根)
直接bsgs求a,b就好了

#include<bits/stdc++.h>
using namespace std;
int re(){
	int x=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*w;
}
int g,p,n,a,b,m,t;
map<int,int>M;
void mul(int&x,int y){x=1ll*x*y%p;}
int ksm(int x,int y){
	int s=1;
	while(y){if(y&1)mul(s,x);mul(x,x);y>>=1;}
	return s;
}
int bsgs(int y){
	M.clear();
	int s=y;
	for(int i=0;i<m;i++){
		M[s]=i;mul(s,g);
	}
	s=1;
	for(int i=1;i<=m;i++){
		mul(s,t);
		if(M.count(s))return m*i-M[s];
	}
}
int main(){
	g=re(),p=re(),n=re();
	m=sqrt(p)+1;t=ksm(g,m);
	while(n--){
		a=bsgs(re()%p);
		b=bsgs(re()%p);
		printf("%d
",ksm(g,1ll*a*b%(p-1)));
	}
	return 0;
}
原文地址:https://www.cnblogs.com/sdzwyq/p/9931288.html