//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define el '\n'
#define MASK(i) (1 << (i))
#define BIT(x,i) (((x) >> (i))&1)
#define HSR ios_base::sync_with_stdio(false); cin.tie(0);
#define file "walls"
int delta,t;
ll MOD;
namespace sub12{
const int maxn = (int)5003;
const int maxL = 2*maxn;
int C[maxL][maxn];
void prepare(){
C[0][0] = 1;
for (int i=1;i<maxL;i++){
C[i][0] = 1;
int Lim = min(i,maxn-1);
C[i][Lim] = 1;
for (int j=1;j<Lim;j++) C[i][j] = (C[i-1][j-1]+C[i-1][j])%MOD;
}
}
void solve(){
prepare();
while(t--){
int n,k;
cin >> n >> k;
cout << ((C[n+k][k]-1)+MOD)%MOD << " ";
}
}
}
namespace sub3{
const int maxn = (int)2e6 + 3;
ll fact[maxn], inv_fact[maxn];
ll pw_mod(ll base, ll pw){
ll res = 1;
ll mul = base;
while(pw){
if (pw&1) res = (res*mul)%MOD;
mul = (mul*mul)%MOD;
pw/=2;
}
return res;
}
void prepare(){
fact[0] = 1;
for (int i=1;i<maxn;i++) fact[i] = (fact[i-1]*i)%MOD;
inv_fact[maxn-1] = pw_mod(fact[maxn-1],MOD-2);
for (int i=maxn-2;i>=0;i--) inv_fact[i] = (inv_fact[i+1]*(i+1))%MOD;
}
ll C(int n, int k){
ll tmp = (fact[n]*inv_fact[k])%MOD;
tmp = (tmp*inv_fact[n-k])%MOD;
return tmp;
}
void solve(){
prepare();
while(t--){
int n,k;
cin >> n >> k;
cout << ((C(n+k,k)-1)+MOD)%MOD << " ";
}
}
}
namespace sub4{
const int maxn = (int)1e6 + 3;
ll fact[maxn], inv_fact[maxn];
ll pw_mod(ll base, ll pw){
ll res = 1;
ll mul = base;
while(pw){
if (pw&1) res = (res*mul)%MOD;
mul = (mul*mul)%MOD;
pw/=2;
}
return res;
}
void prepare(){
fact[0] = 1;
for (int i=1;i<maxn;i++) fact[i] = (fact[i-1]*i)%MOD;
inv_fact[maxn-1] = pw_mod(fact[maxn-1],MOD-2);
for (int i=maxn-2;i>=0;i--) inv_fact[i] = (inv_fact[i+1]*(i+1))%MOD;
}
ll C(ll n, ll k){
ll tmp = 1;
for (ll i=n;i>=n-k+1;i--) tmp = (tmp*(i%MOD))%MOD;
tmp = (tmp*inv_fact[k])%MOD;
return tmp;
}
void solve(){
prepare();
while(t--){
ll n,k;
cin >> n >> k;
cout << ((C(n+k,k)-1)+MOD)%MOD << " ";
}
}
}
namespace sub5{
const int maxn = (int)2e6 + 2;
bool isPrime[maxn];
vector<ll> Prime;
void sieve(){
for (int i=2;i<maxn;i++) isPrime[i] = true;
for (int i=2;1ll*i*i<maxn;i++){
if (isPrime[i]){
for (int j=i*i;j<maxn;j+=i) isPrime[j] = false;
}
}
}
ll pw_mod(ll base, ll pw){
ll res = 1;
ll mul = base;
while(pw){
if (pw&1) res = (res*mul)%MOD;
mul = (mul*mul)%MOD;
pw/=2;
}
return res;
}
void prepare(){
for (int i=2;i<maxn;i++){
if (isPrime[i]) Prime.push_back(i);
}
}
ll getExp(ll n, ll p){
ll res = 0;
ll pw = p;
while(pw <= n){
res += n/pw;
pw *= p;
}
return res;
}
ll C(ll n, ll k){
if (k > n) return 0;
ll res = 1;
for (ll cur_p:Prime){
if (cur_p > n) break;
ll pw = getExp(n,cur_p)-getExp(k,cur_p)-getExp(n-k,cur_p);
res = (res*pw_mod(cur_p,pw))%MOD;
}
return res;
}
void solve(){
sieve();
prepare();
while(t--){
ll n,k;
cin >> n >> k;
cout << ((C(n+k,k)-1)+MOD)%MOD << " ";
}
}
}
int main(){
HSR
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
cin >> delta >> t >> MOD;
bool isOneTwo = false, isThree = false, isFour = false, isFive = false;
if ((delta == 1) || (delta == 2)) isOneTwo = true;
if (delta == 3) isThree = true;
if (delta == 4) isFour = true;
if (delta == 5) isFive = true;
if (isOneTwo) sub12::solve();
if (isThree) sub3::solve();
if (isFour) sub4::solve();
if (isFive) sub5::solve();
return 0;
}