[CQOI2018]破解D-H协议
[CQOI2018]破解D-H协议
luogu
BZOJ
题面看了好久啊...
题意:给定\(A=g^a\mod p,B=g^b\mod 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\n",ksm(g,1ll*a*b%(p-1)));
}
return 0;
}