模板题呀.
code:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int g,mod;
map<int,int>bu;
int qpow(int x,ll y)
{
int tmp=1;
for(;y;y>>=1,x=(ll)x*x%mod)
if(y&1) tmp=(ll)tmp*x%mod;
return tmp;
}
int bsgs(int y,int z)
{
// y^x = z ( % mod)
int i,j,m=sqrt(mod)+1,tmp,f;
z%=mod;
if(z==1) return 0;
bu.clear(),bu[z]=0;
for(tmp=z,i=1;i<m;++i) tmp=(ll)tmp*y%mod,bu[tmp]=i;
for(tmp=1,f=qpow(y,m),i=1;i<=m+1;++i)
{
tmp=(ll)tmp*f%mod;
if(bu.count(tmp)) return i*m-bu[tmp];
}
}
void solve()
{
int i,j,A,B;
scanf("%d%d",&A,&B);
int a=bsgs(g,A),b=bsgs(g,B);
printf("%d\n",qpow(g,(ll)a*b));
}
int main()
{
// setIO("input");
int i,j,T;
scanf("%d%d%d",&g,&mod,&T);
while(T--) solve();
return 0;
}