// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;const int N=262144+10;typedef unsigned long long ll;
const int P=65536;const int SF=16;const int msk=65535;ll mod;ll PP;
typedef long double ld;const ld pi=acos(-1.0);
inline ll po(ll a,ll p){ll r=1;for(;p;p>>=1,a=a*a%mod)if(p&1)r=r*a%mod;return r;}
struct cmp
{
ld r;ld v;
friend cmp operator +(cmp a,cmp b){return (cmp){a.r+b.r,a.v+b.v};}
friend cmp operator -(cmp a,cmp b){return (cmp){a.r-b.r,a.v-b.v};}
friend cmp operator *(cmp a,cmp b){return (cmp){a.r*b.r-a.v*b.v,a.r*b.v+a.v*b.r};}
void operator /=(const int& len){r/=len;v/=len;}
}rt[2][22][N],tr[N],tr1[N],tr2[N],tr3[N],tr4[N],tr5[N],tr6[N];
int rv[22][N];ll m13[N],m14[N],m23[N],m24[N];
inline void pre()
{
for(int d=1;d<=18;d++)
for(int i=1;i<(1<<d);i++)rv[d][i]=(rv[d][i>>1]>>1)|((i&1)<<(d-1));
for(int d=1,t=1;d<=18;d++,t<<=1)
for(int i=0;i<(1<<d);i++)rt[0][d][i]=(cmp){cos(pi*i/t),sin(pi*i/t)};
for(int d=1,t=1;d<=18;d++,t<<=1)
for(int i=0;i<(1<<d);i++)rt[1][d][i]=(cmp){cos(pi*i/t),-sin(pi*i/t)};
}inline void fft(cmp* a,int len,int d,int o)
{
for(int i=1;i<len;i++)if(i<rv[d][i])swap(a[i],a[rv[d][i]]);cmp* w;int i;
for(int k=1,j=1;k<len;k<<=1,j++)
for(int s=0;s<len;s+=(k<<1))
for(i=s,w=rt[o][j];i<s+k;i++,++w)
{cmp a1=a[i+k]*(*w);a[i+k]=a[i]-a1;a[i]=a[i]+a1;}
if(o)for(int i=0;i<len;i++)a[i]/=len;
}inline void dbdft(ll* a,int len,int d,cmp* op1,cmp* op2)
{
for(int i=0;i<len;i++)tr[i]=(cmp){(ld)(a[i]>>SF),(ld)(a[i]&msk)};
fft(tr,len,d,0);tr[len]=tr[0];
for(cmp* p1=tr,*p2=tr+len,*p3=op1;p1!=tr+len;++p1,--p2,++p3)
(*p3)=(cmp){p1->r+p2->r,p1->v-p2->v}*(cmp){0.5,0};
for(cmp* p1=tr,*p2=tr+len,*p3=op2;p1!=tr+len;++p1,--p2,++p3)
(*p3)=(cmp){p1->r-p2->r,p1->v+p2->v}*(cmp){0,-0.5};
}inline void dbidft(cmp* tr,int len,int d,ll* a,ll* b)
{
fft(tr,len,d,1);
for(int i=0;i<len;i++)a[i]=(ll)(tr[i].r+0.5)%mod;
for(int i=0;i<len;i++)b[i]=(ll)(tr[i].v+0.5)%mod;
}inline void poly_mul(ll* a,ll* b,ll* c,int len,int d)//以上都是任意模数fft的板子
{
dbdft(a,len,d,tr1,tr2);dbdft(b,len,d,tr3,tr4);
for(int i=0;i<len;i++)tr5[i]=tr1[i]*tr3[i]+(cmp){0,1}*tr2[i]*tr4[i];
for(int i=0;i<len;i++)tr6[i]=tr2[i]*tr3[i]+(cmp){0,1}*tr1[i]*tr4[i];
dbidft(tr5,len,d,m13,m24);dbidft(tr6,len,d,m23,m14);
for(int i=0;i<len;i++)c[i]=m13[i]*PP%mod;
for(int i=0;i<len;i++)(c[i]+=(m23[i]+m14[i])*P+m24[i])%=mod;
}namespace iter
{
ll f[N];ll g[N];ll h[N];ll ifac[N];
inline void ih()
{
ifac[0]=ifac[1]=1;
for(int i=2;i<min((ll)N,mod);i++)ifac[i]=(mod-mod/i)*ifac[mod%i]%mod;
for(int i=1;i<min((ll)N,mod);i++)(ifac[i]*=ifac[i-1])%=mod;
}inline void calch(ll del,int cur,ll* ip,ll* op)
{
int d=0;int len=1;while(len<=cur+cur+cur)len<<=1,d++;
for(int i=0;i<=cur;i++)f[i]=ip[i]*ifac[i]%mod*ifac[cur-i]%mod;
for(int i=cur-1;i>=0;i-=2)f[i]=(mod-f[i])%mod;
for(int i=0;i<=cur+cur;i++)g[i]=po((del+mod-cur+i)%mod,mod-2);
for(int i=cur+1;i<len;i++)f[i]=0;for(int i=cur+cur+1;i<len;i++)g[i]=0;
poly_mul(f,g,h,len,d);//卷积求出h'
ll xs=1;ll p1=del-cur;ll p2=del;
for(int i=p1;i<=p2;i++)(xs*=i)%=mod;
for(int i=0;i<=cur;i++,p1++,p2++)//双指针求出系数
{
op[i]=h[i+cur]*xs%mod;
(xs*=po(p1,mod-2))%=mod,(xs*=(p2+1))%=mod;
}
}
}ll val[N];ll fv1[N];ll fv2[N];
inline void solve(int n)//倍增
{
int hb=0;for(int p=n;p;p>>=1)hb++;val[0]=1;
for(int z=hb,cur=0;z>=0;z--)
{
if(cur!=0)//把d乘2
{
iter::calch(cur+1,cur,val,fv1);
for(int i=0;i<=cur;i++)val[cur+i+1]=fv1[i];val[cur<<1|1]=0;
iter::calch(cur*po(n,mod-2)%mod,cur<<1,val,fv2);
cur<<=1;for(int i=0;i<=cur;i++)(val[i]*=fv2[i])%=mod;
}if((n>>z)&1)//把d加1
{
for(int i=0;i<=cur;i++)(val[i]*=(ll)(n*i)+cur+1)%=mod;cur|=1;val[cur]=1;
for(int i=1;i<=cur;i++)(val[cur]*=(ll)cur*n+i)%=mod;
}
}
}
void solve()
{
pre();int n;scanf("%d%lld",&n,&mod);iter::ih();
int bl=sqrt(n);PP=(ll)P*P%mod;solve(bl);ll res=1;
for(int i=0,id=0;;i+=bl,id++)//分块
{
if((ll)i+bl>n){for(int j=i+1;j<=n;j++)(res*=j)%=mod;break;}
(res*=val[id])%=mod;
}printf("%lld\n",res);
}
int main()
{
int T;scanf("%d",&T);while(T--)solve();
return 0;//拜拜程序~
}
Ly8gbHVvZ3UtanVkZ2VyLWVuYWJsZS1vMgojaW5jbHVkZTxjc3RkaW8+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Y29uc3QgaW50IE49MjYyMTQ0KzEwO3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGxsOwpjb25zdCBpbnQgUD02NTUzNjtjb25zdCBpbnQgU0Y9MTY7Y29uc3QgaW50IG1zaz02NTUzNTtsbCBtb2Q7bGwgUFA7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7Y29uc3QgbGQgcGk9YWNvcygtMS4wKTsKaW5saW5lIGxsIHBvKGxsIGEsbGwgcCl7bGwgcj0xO2Zvcig7cDtwPj49MSxhPWEqYSVtb2QpaWYocCYxKXI9ciphJW1vZDtyZXR1cm4gcjt9CnN0cnVjdCBjbXAKewogICAgbGQgcjtsZCB2OwogICAgZnJpZW5kIGNtcCBvcGVyYXRvciArKGNtcCBhLGNtcCBiKXtyZXR1cm4gKGNtcCl7YS5yK2IucixhLnYrYi52fTt9CiAgICBmcmllbmQgY21wIG9wZXJhdG9yIC0oY21wIGEsY21wIGIpe3JldHVybiAoY21wKXthLnItYi5yLGEudi1iLnZ9O30KICAgIGZyaWVuZCBjbXAgb3BlcmF0b3IgKihjbXAgYSxjbXAgYil7cmV0dXJuIChjbXApe2EucipiLnItYS52KmIudixhLnIqYi52K2EudipiLnJ9O30KICAgIHZvaWQgb3BlcmF0b3IgLz0oY29uc3QgaW50JiBsZW4pe3IvPWxlbjt2Lz1sZW47fQp9cnRbMl1bMjJdW05dLHRyW05dLHRyMVtOXSx0cjJbTl0sdHIzW05dLHRyNFtOXSx0cjVbTl0sdHI2W05dOwppbnQgcnZbMjJdW05dO2xsIG0xM1tOXSxtMTRbTl0sbTIzW05dLG0yNFtOXTsKaW5saW5lIHZvaWQgcHJlKCkKewogICAgZm9yKGludCBkPTE7ZDw9MTg7ZCsrKQogICAgICAgIGZvcihpbnQgaT0xO2k8KDE8PGQpO2krKylydltkXVtpXT0ocnZbZF1baT4+MV0+PjEpfCgoaSYxKTw8KGQtMSkpOwogICAgZm9yKGludCBkPTEsdD0xO2Q8PTE4O2QrKyx0PDw9MSkKICAgICAgICBmb3IoaW50IGk9MDtpPCgxPDxkKTtpKyspcnRbMF1bZF1baV09KGNtcCl7Y29zKHBpKmkvdCksc2luKHBpKmkvdCl9OwogICAgZm9yKGludCBkPTEsdD0xO2Q8PTE4O2QrKyx0PDw9MSkKICAgICAgICBmb3IoaW50IGk9MDtpPCgxPDxkKTtpKyspcnRbMV1bZF1baV09KGNtcCl7Y29zKHBpKmkvdCksLXNpbihwaSppL3QpfTsKfWlubGluZSB2b2lkIGZmdChjbXAqIGEsaW50IGxlbixpbnQgZCxpbnQgbykKewogICAgZm9yKGludCBpPTE7aTxsZW47aSsrKWlmKGk8cnZbZF1baV0pc3dhcChhW2ldLGFbcnZbZF1baV1dKTtjbXAqIHc7aW50IGk7CiAgICBmb3IoaW50IGs9MSxqPTE7azxsZW47azw8PTEsaisrKQogICAgICAgIGZvcihpbnQgcz0wO3M8bGVuO3MrPShrPDwxKSkKICAgICAgICAgICAgZm9yKGk9cyx3PXJ0W29dW2pdO2k8cytrO2krKywrK3cpCiAgICAgICAgICAgICAgICB7Y21wIGExPWFbaStrXSooKncpO2FbaStrXT1hW2ldLWExO2FbaV09YVtpXSthMTt9CiAgICBpZihvKWZvcihpbnQgaT0wO2k8bGVuO2krKylhW2ldLz1sZW47Cn1pbmxpbmUgdm9pZCBkYmRmdChsbCogYSxpbnQgbGVuLGludCBkLGNtcCogb3AxLGNtcCogb3AyKQp7CiAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspdHJbaV09KGNtcCl7KGxkKShhW2ldPj5TRiksKGxkKShhW2ldJm1zayl9OwogICAgZmZ0KHRyLGxlbixkLDApO3RyW2xlbl09dHJbMF07CiAgICBmb3IoY21wKiBwMT10ciwqcDI9dHIrbGVuLCpwMz1vcDE7cDEhPXRyK2xlbjsrK3AxLC0tcDIsKytwMykKICAgICAgICAoKnAzKT0oY21wKXtwMS0+citwMi0+cixwMS0+di1wMi0+dn0qKGNtcCl7MC41LDB9OwogICAgZm9yKGNtcCogcDE9dHIsKnAyPXRyK2xlbiwqcDM9b3AyO3AxIT10citsZW47KytwMSwtLXAyLCsrcDMpCiAgICAgICAgKCpwMyk9KGNtcCl7cDEtPnItcDItPnIscDEtPnYrcDItPnZ9KihjbXApezAsLTAuNX07Cn1pbmxpbmUgdm9pZCBkYmlkZnQoY21wKiB0cixpbnQgbGVuLGludCBkLGxsKiBhLGxsKiBiKQp7CiAgICBmZnQodHIsbGVuLGQsMSk7CiAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspYVtpXT0obGwpKHRyW2ldLnIrMC41KSVtb2Q7CiAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspYltpXT0obGwpKHRyW2ldLnYrMC41KSVtb2Q7Cn1pbmxpbmUgdm9pZCBwb2x5X211bChsbCogYSxsbCogYixsbCogYyxpbnQgbGVuLGludCBkKS8v5Lul5LiK6YO95piv5Lu75oSP5qih5pWwZmZ055qE5p2/5a2QIAp7CiAgICBkYmRmdChhLGxlbixkLHRyMSx0cjIpO2RiZGZ0KGIsbGVuLGQsdHIzLHRyNCk7CiAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspdHI1W2ldPXRyMVtpXSp0cjNbaV0rKGNtcCl7MCwxfSp0cjJbaV0qdHI0W2ldOwogICAgZm9yKGludCBpPTA7aTxsZW47aSsrKXRyNltpXT10cjJbaV0qdHIzW2ldKyhjbXApezAsMX0qdHIxW2ldKnRyNFtpXTsKICAgIGRiaWRmdCh0cjUsbGVuLGQsbTEzLG0yNCk7ZGJpZGZ0KHRyNixsZW4sZCxtMjMsbTE0KTsKICAgIGZvcihpbnQgaT0wO2k8bGVuO2krKyljW2ldPW0xM1tpXSpQUCVtb2Q7CiAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspKGNbaV0rPShtMjNbaV0rbTE0W2ldKSpQK20yNFtpXSklPW1vZDsKfW5hbWVzcGFjZSBpdGVyCnsKICAgIGxsIGZbTl07bGwgZ1tOXTtsbCBoW05dO2xsIGlmYWNbTl07CiAgICBpbmxpbmUgdm9pZCBpaCgpCiAgICB7CiAgICAgICAgaWZhY1swXT1pZmFjWzFdPTE7CiAgICAgICAgZm9yKGludCBpPTI7aTxtaW4oKGxsKU4sbW9kKTtpKyspaWZhY1tpXT0obW9kLW1vZC9pKSppZmFjW21vZCVpXSVtb2Q7CiAgICAgICAgZm9yKGludCBpPTE7aTxtaW4oKGxsKU4sbW9kKTtpKyspKGlmYWNbaV0qPWlmYWNbaS0xXSklPW1vZDsKICAgIH1pbmxpbmUgdm9pZCBjYWxjaChsbCBkZWwsaW50IGN1cixsbCogaXAsbGwqIG9wKQogICAgewogICAgICAgIGludCBkPTA7aW50IGxlbj0xO3doaWxlKGxlbjw9Y3VyK2N1citjdXIpbGVuPDw9MSxkKys7CiAgICAgICAgZm9yKGludCBpPTA7aTw9Y3VyO2krKylmW2ldPWlwW2ldKmlmYWNbaV0lbW9kKmlmYWNbY3VyLWldJW1vZDsKICAgICAgICBmb3IoaW50IGk9Y3VyLTE7aT49MDtpLT0yKWZbaV09KG1vZC1mW2ldKSVtb2Q7CiAgICAgICAgZm9yKGludCBpPTA7aTw9Y3VyK2N1cjtpKyspZ1tpXT1wbygoZGVsK21vZC1jdXIraSklbW9kLG1vZC0yKTsgCiAgICAgICAgZm9yKGludCBpPWN1cisxO2k8bGVuO2krKylmW2ldPTA7Zm9yKGludCBpPWN1citjdXIrMTtpPGxlbjtpKyspZ1tpXT0wOwogICAgICAgIHBvbHlfbXVsKGYsZyxoLGxlbixkKTsvL+WNt+enr+axguWHumgnIAogICAgICAgIGxsIHhzPTE7bGwgcDE9ZGVsLWN1cjtsbCBwMj1kZWw7CiAgICAgICAgZm9yKGludCBpPXAxO2k8PXAyO2krKykoeHMqPWkpJT1tb2Q7CiAgICAgICAgZm9yKGludCBpPTA7aTw9Y3VyO2krKyxwMSsrLHAyKyspLy/lj4zmjIfpkojmsYLlh7rns7vmlbAgCiAgICAgICAgewogICAgICAgICAgICBvcFtpXT1oW2krY3VyXSp4cyVtb2Q7CiAgICAgICAgICAgICh4cyo9cG8ocDEsbW9kLTIpKSU9bW9kLCh4cyo9KHAyKzEpKSU9bW9kOwogICAgICAgIH0gIAogICAgfQp9bGwgdmFsW05dO2xsIGZ2MVtOXTtsbCBmdjJbTl07CmlubGluZSB2b2lkIHNvbHZlKGludCBuKS8v5YCN5aKeIAp7CiAgICBpbnQgaGI9MDtmb3IoaW50IHA9bjtwO3A+Pj0xKWhiKys7dmFsWzBdPTE7CiAgICBmb3IoaW50IHo9aGIsY3VyPTA7ej49MDt6LS0pCiAgICB7CiAgICAgICAgaWYoY3VyIT0wKS8v5oqKZOS5mDIgCiAgICAgICAgewogICAgICAgICAgICBpdGVyOjpjYWxjaChjdXIrMSxjdXIsdmFsLGZ2MSk7CiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8PWN1cjtpKyspdmFsW2N1citpKzFdPWZ2MVtpXTt2YWxbY3VyPDwxfDFdPTA7CiAgICAgICAgICAgIGl0ZXI6OmNhbGNoKGN1cipwbyhuLG1vZC0yKSVtb2QsY3VyPDwxLHZhbCxmdjIpOwogICAgICAgICAgICBjdXI8PD0xO2ZvcihpbnQgaT0wO2k8PWN1cjtpKyspKHZhbFtpXSo9ZnYyW2ldKSU9bW9kOwogICAgICAgIH1pZigobj4+eikmMSkvL+aKimTliqAxIAogICAgICAgIHsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTw9Y3VyO2krKykodmFsW2ldKj0obGwpKG4qaSkrY3VyKzEpJT1tb2Q7Y3VyfD0xO3ZhbFtjdXJdPTE7CiAgICAgICAgICAgIGZvcihpbnQgaT0xO2k8PWN1cjtpKyspKHZhbFtjdXJdKj0obGwpY3VyKm4raSklPW1vZDsKICAgICAgICB9CiAgICB9Cn0Kdm9pZCBzb2x2ZSgpCnsKICAgIHByZSgpO2ludCBuO3NjYW5mKCIlZCVsbGQiLCZuLCZtb2QpO2l0ZXI6OmloKCk7CiAgICBpbnQgYmw9c3FydChuKTtQUD0obGwpUCpQJW1vZDtzb2x2ZShibCk7bGwgcmVzPTE7CiAgICBmb3IoaW50IGk9MCxpZD0wOztpKz1ibCxpZCsrKS8v5YiG5Z2XIAogICAgewogICAgICAgIGlmKChsbClpK2JsPm4pe2ZvcihpbnQgaj1pKzE7ajw9bjtqKyspKHJlcyo9aiklPW1vZDticmVhazt9CiAgICAgICAgKHJlcyo9dmFsW2lkXSklPW1vZDsKICAgIH1wcmludGYoIiVsbGRcbiIscmVzKTsKfQppbnQgbWFpbigpCnsKCWludCBUO3NjYW5mKCIlZCIsJlQpO3doaWxlKFQtLSlzb2x2ZSgpOwoJcmV0dXJuIDA7Ly/mi5zmi5znqIvluo9+IAp9