1. 程式人生 > >CQOI2018 破解D-H協議

CQOI2018 破解D-H協議

題目描述

題解:

貌似是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; }