#include <iostream>
#include <algorithm>

using ull = unsigned long long;

static constexpr size_t max_n {(size_t)2e3+5}; 

ull k, c[max_n][max_n], prefix[max_n][max_n], t, n, m;

static void init(){
    c[0][0] = c[1][0] = c[1][1] = 1;
    for(ull i {2};i<max_n;i++){
        c[i][0]=1;
        for(ull j{1};j<=i;j++){
            c[i][j] = (c[i-1][j-1] + c[i-1][j])%k;
        }
    }
    for(ull i {2};i<max_n;i++){ //t被修改
        for(ull j{1};j<=i;j++){
            prefix[i][j] = prefix[i-1][j]+prefix[i][j-1]-prefix[i-1][j-1] + (c[i][j]==0?1:0);
        }
        prefix[i][i+1] = prefix[i][i];
    }
}

#define NV(v)#v<<" : "<<(v)

int main(){
    std::cin>>t>>k;
    std::cout<<NV(t)<<'\n'<<NV(k)<<'\n';
    init();
    for(ull i {0};i<t;i++){
        std::cout<<NV(t)<<'\n'<<NV(k)<<'\n';
        std::cin>>n>>m;
        std::cout<<"test\n";
        m = std::min(m,n);
        std::cout<<(prefix[n][m])<<'\n';
    }
}