#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
// Dùng kiểu long long cho N và P để đảm bảo đủ lớn
typedef long long ll;
 
void solve() {
    ll N;
    int M, K;
    ll P;
 
    // Đọc input: N, M, K, P
    if (!(cin >> N >> M >> K >> P)) {
        return;
    }
 
    // Pmax là tổng chênh lệch tối đa: (K-1) * M
    int P_max = (K - 1) * M;
 
    // DP: f[k][s] là số chuỗi k ngày có tổng chênh lệch s.
    // Dùng vector 2D để lưu DP (k chỉ chạy đến K, s chỉ chạy đến P_max)
    // Kích thước: (K+1) x (P_max + 1)
    vector<vector<ll>> f(K + 1, vector<ll>(P_max + 1, 0));
 
    // G[k][s] là tổng tiền tố: sum_{j=0}^{s} f[k][j]
    vector<vector<ll>> G(K + 1, vector<ll>(P_max + 1, 0));
 
    // --- 1. Trường hợp cơ sở: k=1 ---
    // f[1][0] = 1 (chênh lệch 0)
    f[1][0] = 1;
    // G[1][s] = 1 cho s >= 0
    for (int s = 0; s <= P_max; ++s) {
        G[1][s] = 1;
    }
 
    // --- 2. Tính DP từ k=2 đến K ---
    for (int k = 2; k <= K; ++k) {
        // Tổng chênh lệch min: k-1
        int s_min = k - 1; 
        // Tổng chênh lệch max: (k-1) * M
 
        for (int s = s_min; s <= P_max; ++s) {
            // Công thức truy hồi tối ưu: f[k][s] = G[k-1][s-1] - G[k-1][s-M-1]
            // G[k-1][s-1]: tổng đến s-1
            ll sum_upper = G[k - 1][s - 1]; 
 
            // G[k-1][s-M-1]: tổng đến s-M-1
            ll sum_lower = 0;
            if (s - M - 1 >= 0) {
                sum_lower = G[k - 1][s - M - 1];
            }
 
            // f[k][s] = (sum_upper - sum_lower) mod P
            ll current_f = (sum_upper - sum_lower + P) % P; 
            f[k][s] = current_f;
 
            // Cập nhật tổng tiền tố G[k][s]
            G[k][s] = (G[k][s - 1] + f[k][s]) % P;
        }
    }
 
    // --- 3. Tính kết quả cuối cùng ---
    ll S0 = 0; // S0 = sum f[K][s]
    ll S1 = 0; // S1 = sum s * f[K][s]
 
    // Bắt đầu từ chênh lệch tối thiểu: K-1
    int s_start = K - 1; 
 
    for (int s = s_start; s <= P_max; ++s) {
        if (f[K][s] == 0) continue; // Bỏ qua nếu f[K][s] = 0
 
        // Tính S0
        S0 = (S0 + f[K][s]) % P;
 
        // Tính S1 = sum s * f[K][s]
        // (s * f[K][s]) mod P
        ll term_s1 = ((ll)s % P) * (f[K][s] % P) % P;
        S1 = (S1 + term_s1) % P;
    }
 
    // Công thức: Answer = (N * S0 - S1) mod P
    // N mod P:
    ll N_mod_P = N % P;
 
    // (N_mod_P * S0) mod P
    ll term_N_S0 = (N_mod_P * S0) % P;
 
    // Answer = (term_N_S0 - S1 + P) mod P (Đảm bảo kết quả dương)
    ll final_answer = (term_N_S0 - S1 + P) % P;
 
    cout << final_answer << endl;
}
 
int main() {
    // Tăng tốc độ I/O
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    solve();
 
    return 0;
}