CQOI2018 破解D-H協議
阿新 • • 發佈:2018-11-30
題解:
貌似是BSGS板子題。
程式碼:
#include<map> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long long map<int,int>mp; ll fastpow(ll x,ll y,ll p) { ll ret = 1ll; while(y) { if(y&1)ret=ret*x%p; x=x*x%p; y>>=1; } return ret; } ll F2(int y,int z,int p) { y%=p,z%=p; ll ret = fastpow(y,p-2,p); return ret*(z%p)%p; } int g,p,n,a,b; int main() { scanf("%d%d%d",&g,&p,&n); ll m = (ll)sqrt(p); ll now = 1; mp[1]=0; for(int i=1;i<=m;i++) { now=now*g%p; if(mp.find(now)==mp.end()) mp[now]=i; } while(n--) { scanf("%d%d",&a,&b); ll u = 1; for(int i=0;i<=m+2;i++) { ll tmp = F2(u,a,p); if(mp.find(tmp)!=mp.end()) { ll ans= 1ll*mp[tmp]; ans=(ans+m*i)%p; printf("%lld\n",fastpow(b,ans,p)); break; } u=u*now%p; } } return 0; }