#include using namespace std; typedef long long ll; #define REP(i, n) for(int(i)=0;(i)<(n);++(i)) const int MOD = 1000000007; const int max_r = 32000; bool prime[max_r]; bool isprime(int n){ if(n < max_r) return prime[n]; if(n % 2 == 0) return false; for(int i = 3; i < max_r; i += 2){ if(!prime[i]) continue; if(n % i == 0) return false; } return true; } ll extgcd(ll a,ll b,ll &m,ll &n){ll g=a;m=1;n=0;if(b)g=extgcd(b,a%b,n,m),n-=(a/b)*m;return g;} ll divmod(ll n, ll m, ll mod){ ll a,b; extgcd(m,mod,a,b); return (n * a) % mod; } ll solve(int N, int M){ if(N >= M) return 0; // N >= M の場合、N!の因数にMが含まれるため必ずMの倍数 if(N == 0) return 1 % M; if(M < 200000){ ll res = 1; for(int i = 2; i <= N; i++){ res = (res * i) % M; } return res; } if(isprime(M)){ // ウィルソンの定理より (M-1)! ≡ M-1 (mod M) なので、 // N! * (N+1)(N+2)..(M-1) = (M-1)! // N! = M! / (N+1)(N+2)..(M-1) ll m = -1; for(int i = N+1; i < M; i++){ m = divmod(m, i, M); } return (m+M)%M; } // M は 2e5以上の合成数 // なんやかんやで 0 になる(´・_・`) return 0; } int T,N,M; set s; int main(){ memset(prime, 1, sizeof(prime)); prime[0] = prime[1] = false; for(int i = 4; i < max_r; i += 2) prime[i] = false; for(int i = 3; i < max_r; i += 2){ if(!prime[i]) continue; for(int j = i+i; j < max_r; j += i) prime[j] = false; } cin >> T; REP(i,T){ cin >> N >> M; cout << solve(N,M) << endl; } return 0; }